2011-12-18 10 views
5

私は比較的大きなデータセット(16,000+ x〜31)を持っています。言い換えれば、私はそれをExcelで行ごとに操作したくないほど十分です。データは、この形式である:他の列の値に基づいてカウント列を追加する方法R

block site  day X1 X2 
1  1  1 0.4 5.1 
1  1  2 0.8 1.1 
1  1  3 1.1 4.2 
1  2  1 ... ... 
1  2  2 
1  2  3 
2  3  1 
2  3  2 
2  3  3 
2  4  1 
2  4  2 
2  4  3 

あなたが見ることができるように、サイト数が連続しているが、私は、サイトの数は、各ブロックでリセット列をしたいと思います。例えば、私は以下のようなものたいと思います:

block site  day X1 X2 site2 
1  1  1 0.4 5.1 1 
1  1  2 0.8 1.1 1 
1  1  3 1.1 4.2 1 
1  2  1 ... ... 2 
1  2  2    2 
1  2  3    2 
2  3  1    1 
2  3  2    1 
2  3  3    1 
2  4  1    2 
2  4  2    2 
2  4  3    2 

を私はR関数RLEを使用して考えていたが、理由は一日で合併症のことがうまくいくかどうかわからないです。そうでなければ、私のような何かをしようとするだろう:

Data$site2 <- sequence(rle(Data$block)$lengths) 

誰もが列カウント(シーケンス)各ブロック内のサイトの数を追加するための任意の提案を持っていますか?役立つ場合は、サイトごとに記録された日数は同じですが(263)、ブロックごとに異なるサイト数があります。

ddply(df,.(block),transform, 
        site1 = rep(1:length(unique(site)), 
          times = rle(site)$lengths)) 

それとも少しスリッカーバージョン:

ddply(df,.(block),transform,site1 = as.integer(as.factor(site))) 

使用して、しかし、直接これを行うための賢い方法があるかもしれません

答えて

6

はここplyrddplyを使用して少し不器用なソリューションですさまざまなseqsequencerleの機能がありますが、私の脳は現時点ではやや濁っています。これを少し開いたままにしておくと、誰かが滑らかな非plyrソリューションと一緒に来る可能性が高くなります。

+0

が、これは完全に働いた、ありがとうございます。私は前にplyrを見たことがありますが、それを使ったことはありません。 ddplyは完璧ですが、私は実際にマトリックスを分解して、日にちにreshape(=ワイド)を使用し、rle(サイト)を適用してから、再形成しようとしました(= long)。私はそれが動作するかどうかわからないが、私はそれを行うために約1000の簡単な方法があると思った。私はdpdplyのソリューションが好きです。再度、感謝します。 – djhocking

+0

いいね、ちょうど同様の問題でddplyオプションを試してみて初めて完全に働いた – Ell

1

tapplyはAVE経由

# Make some fake data 
dat <- data.frame(block = rep(1:3, each = 4), site = rep(1:6, each = 2), val = rnorm(12)) 
# For each block reset the count 
dat$site2 <- unlist(tapply(dat$site, dat$block, function(x){x - min(x) + 1})) 
+0

これは私の乱雑なデータのために働くようには思われません。一部のサイトのデータロガーが失敗したり欠落したりして、サイトが完全に連続していないことを忘れていました。時にはデータセット全体でサイト番号がスキップされることもありますが、必要なのは変数だけであり、解析の一部としてループ関数でインデックスを作成することができます。たぶん私はあなたが何を提案しようとするが、いくつかの巧妙な機能を元のサイト番号に基づいてsite2ではなく、以前の値に追加してください。 – djhocking

0

の仕事ができる使用:

df1 <- structure(list(block = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2), 
    site = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4), day = c(1, 
    2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)), .Names = c("block", "site", 
"day"), row.names = c("2", "3", "4", "5", "6", "7", "8", "9", 
"10", "11", "12", "13"), class = "data.frame") 

df1$site2 <- ave(df1$site,df1$block,FUN=function(x) match(x,sort(unique(x)))) 
関連する問題