R Language
ランレングス符号化
サーチ…
備考
ランとは、連続した値または観測の連続したシーケンスです。繰り返される値の場合、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$values
でr$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$lengths
はr$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