サーチ…


備考

ランとは、連続した値または観測の連続したシーケンスです。繰り返される値の場合、Rの「ランレングス符号化」は、その実行に関してベクトルを簡潔に記述します。検討してください:

dat <- c(1, 2, 2, 2, 3, 1, 4, 4, 1, 1)

私たちは、1の長さ1のランを持っています。次に2秒の長さ3ラン。 3秒間の長さ1ラン。等々。 Rのランレングスエンコーディングは、ベクトルのランの長さと値をすべてキャプチャします。

拡張機能

ランはまた、表データの連続した観測値を参照することもできます。 Rにはこれらをエンコードする自然な方法はありませんが、data.tableパッケージ(現在はデッドエンドリンク)からrleidで処理できます。

`rle 'によるランレングス符号化

ランレングス符号化は、ベクトル内の連続する要素のランの長さをキャプチャします。例のベクトルを考えてみましょう:

dat <- c(1, 2, 2, 2, 3, 1, 4, 4, 1, 1)

rle関数は各実行とその長さを抽出します:

r <- rle(dat)
r
# Run Length Encoding
#   lengths: int [1:6] 1 3 1 1 2 2
#   values : num [1:6] 1 2 3 1 4 1

各実行の値はr$valuesr$valuesされr$values

r$values
# [1] 1 2 3 1 4 1

これは、最初に1のランを見た後、2のランを実行した後、3をランし、次に1をランしたことなどをキャプチャします。

各ランの長さはr$lengthsキャプチャされます:

r$lengths
# [1] 1 3 1 1 2 2

我々は、1の最初のランは長さ1であり、続いて2のランは長さ3であった、という具合である。

基底Rでの実行による識別とグループ化

変数の実行によってデータをグループ化して、何らかの分析を実行することができます。次の単純なデータセットを考えてみましょう。

(dat <- data.frame(x = c(1, 1, 2, 2, 2, 1), y = 1:6))
#   x y
# 1 1 1
# 2 1 2
# 3 2 3
# 4 2 4
# 5 2 5
# 6 1 6

変数xは3つのランがあります。長さ2の値1、長さ3の値2、長さ1の値1のランです。変数y平均値を変数x実行(これらの平均値は1.5,4、および6です)。

基底Rでは、最初にrleを使ってx変数のランレングス符号化を計算します。

(r <- rle(dat$x))
# Run Length Encoding
#   lengths: int [1:3] 2 3 1
#   values : num [1:3] 1 2 1

次のステップは、データセットの各行の実行数を計算することです。ランの総数はlength(r$lengths)であり、各ランのr$lengthsr$lengths lengthであることがわかっているので、各ランの実行回数をrepで計算することができます。

(run.id <- rep(seq_along(r$lengths), r$lengths))
# [1] 1 1 2 2 2 3

今度は、 tapplyを使用して、実行IDをグループ化して各実行の平均y値を計算することができます。

data.frame(x=r$values, meanY=tapply(dat$y, run.id, mean))
#   x meanY
# 1 1   1.5
# 2 2   4.0
# 3 1   6.0

data.tableでの実行による識別とグループ化

data.tableパッケージは、データをラン単位でグループ化する便利な方法を提供します。次のデータ例を考えてみましょう。

library(data.table)
(DT <- data.table(x = c(1, 1, 2, 2, 2, 1), y = 1:6))
#    x y
# 1: 1 1
# 2: 1 2
# 3: 2 3
# 4: 2 4
# 5: 2 5
# 6: 1 6

変数xは3つのランがあります。長さ2の値1、長さ3の値2、長さ1の値1のランです。変数y平均値を変数xの実行(これらの平均値は1.5,4、および6です)。

data.table rleid関数は、ベクトルの各要素の実行IDを示すIDを提供します。

rleid(DT$x)
# [1] 1 1 2 2 2 3

この実行IDを簡単にグループ化し、 yデータを要約することができます。

DT[,mean(y),by=.(x, rleid(x))]
#    x rleid  V1
# 1: 1     1 1.5
# 2: 2     2 4.0
# 3: 1     3 6.0

ベクトルを圧縮および解凍するランレングス符号化

同じ値の長いランを持つ長いベクトルは、ランレングスのエンコーディング(各ランの値とその値が繰り返される回数)に格納することで大幅に圧縮できます。例として、1の膨大な数と0のわずかな数を持つ1000万の長さのベクトルを考えてみましょう:

set.seed(144)
dat <- sample(rep(0:1, c(1, 1e5)), 1e7, replace=TRUE)
table(dat)
#       0       1 
#     103 9999897 

1000万エントリを格納するにはかなりのスペースが必要ですが、代わりにこのベクトルのランレングスエンコーディングを使用してデータフレームを作成することができます。

rle.df <- with(rle(dat), data.frame(values, lengths))
dim(rle.df)
# [1] 207   2
head(rle.df)
#   values lengths
# 1      1   52818
# 2      0       1
# 3      1  219329
# 4      0       1
# 5      1  318306
# 6      0       1

ランレングス符号化から、ベクトルの最初の52,818の値は1であり、その後に1つの0、219,329の連続する1、続いて0などがあることがわかります。ランレングスエンコーディングは207エントリしかなく、1000万の値の代わりに414個の値を格納する必要があります。 rle.dfはデータフレームなwrite.csvような標準関数を使って格納することができます。

ランレングス符号化でベクトルを伸長することは、2つの方法で達成することができる。第一の方法は、単に呼び出すことであるrep渡し、 values最初の引数としてランレングス符号化の要素をlengths第二引数としてランレングス符号化の要素:

decompressed <- rep(rle.df$values, rle.df$lengths)

圧縮解除されたデータは元のデータと同一であることが確認できます。

identical(decompressed, dat)
# [1] TRUE

第二の方法は、使用することであるRの組み込みinverse.rle上に機能rleインスタンスのオブジェクト。

rle.obj <- rle(dat)                            # create a rle object here
class(rle.obj)
# [1] "rle"

dat.inv <- inverse.rle(rle.obj)               # apply the inverse.rle on the rle object

我々は、これは正確に元生成することを再確認することができdat

identical(dat.inv, dat)
# [1] TRUE


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow