2016-09-15 3 views
1

私はこの問題をあまりにも長く解決しようとしてきました。私は300 +年(行)と70 +ツリー(列)の年間時系列形式でバイナリ昆虫の大流行のデータを持っています。R - 大きなデータフレームのバイナリ時系列データを条件付きで合計する方法

同じ規模のデータフレーム/マトリックス/データテーブルを累積合計で条件付きで入力し、各アウトブレーク期間の終わりに0にリセットしたいと考えています。私は私の問題に翻訳することができない同様の質問/回答の富を見つけました。

私はこのようになりますデータフレームのスニペット、例えば、あるでしょう:

 t1 t2 t3 t4 t5 
2000 1 0 0 1 0 
2001 1 0 0 0 1 
2002 1 1 0 0 1 
2003 0 1 0 1 1 
2004 1 1 1 1 1 

をそして、私はこのようになります新しいDF作成したい:私は「

 t1 t2 t3 t4 t5 
2000 1 0 0 1 0 
2001 2 0 0 0 1 
2002 3 1 0 0 2 
2003 0 2 0 1 3 
2004 1 3 1 2 4 

を私はdata.tableパッケージとrleパッケージの両方に近づいていると感じましたが、私はまたたくさんのサークルに入っていました。(私は一度は1つのカラムでそれをやったことは確かですが、なぜすべての列のループで動かすことができなかったのか...)。

私はいつもにいくつかの限り、通常は単一の列を動作するように、以下の方法を得て、またはその単一の列が0 1 2 2 1 0代わりの0 1 2 3 4 0のように見えるかもしれませんが、シフトDFの上に1人の1 DFを追加しました。 data.tabledplyr

rleは私があれば教えてください:

setDT(dt)[, new := t1 + shift(t1, fill = 0)] 


apply(
    rle(matrix)$lengths 
    , 2, seq) 
rle(matrix[,1])$lengths 


for(i in 1:dim(dt)[1]) { 
    for(j in 1:dim(dt)[2]) { 
    cols <- names(dt) # tried in place of .SD with negative results 
    if(dt[i,j] == 1) { 
     dt[, new := .SD + shift(.SD, 1L, fill = 0, type = "lag", give.names = TRUE)] 
    } else { dt } 
    } 
} 

私が使用したメインSO源のいくつかは、これらのページが含まれます。この場合に役立ちますいくつかの試みは、このように見てコードのバリエーションとなっています私は重要な情報が欠けている(私は新しい!)。 &何か助けてくれてありがとう!

答えて

1

我々はbase R

df2 <- df1 #create a copy of df1 
#loop through the columns of 'df2', apply the `rle`, get the 'sequence' 
#of 'lengths' and multiply with the column values. 
df2[] <- lapply(df2, function(x) sequence(rle(x)$lengths)*x) 
df2 
#  t1 t2 t3 t4 t5  
#2000 1 0 0 1 0 
#2001 2 0 0 0 1 
#2002 3 1 0 0 2 
#2003 0 2 0 1 3 
#2004 1 3 1 2 4 
+1

からsequencerleを使用することができますこれはすばやく簡単に動作します。ありがとう。私の髪を引き裂く1週間、これは簡単です!私は、df2の括弧に行/列への参照がまったく空のままになることは決してありませんでした。私は関数{x}を浮動小数点関数で浮動小数点に変換したことがありません。それは本当に新しい/私に混乱しています。 – alaskayo

1

あなたは、列自体のrleidでグループ化された各列のCUMSUMを計算するave機能と組み合わせるdata.tableを使用することができます。

library(data.table) 
setDT(dt)[, names(dt) := lapply(.SD, function(col) ave(col, rleid(col), FUN = cumsum))][] 

# t1 t2 t3 t4 t5 
#1: 1 0 0 1 0 
#2: 2 0 0 0 1 
#3: 3 1 0 0 2 
#4: 0 2 0 1 3 
#5: 1 3 1 2 4