2

良い一日、

d <- c(1,1,1,2,2,2,3,3,3)
e <- c(5,6,7,5,6,7,5,6,7)
f <- c(0,0,1,0,1,0,0,0,1)
df <- data.frame(d,e,f)

上記のようなデータがあります。私がする必要があるのは、dの一意の要素ごとに、fの最初の非ゼロ値を見つけ、eの対応する値を見つけることです。具体的には、別のベクトルgが必要なので、次のようになります。

d <- c(1,1,1,2,2,2,3,3,3)
e <- c(5,6,7,5,6,7,5,6,7)
f <- c(0,0,1,0,1,0,0,0,1)
g <- c(7,7,7,6,6,6,7,7,7)
df <- data.frame(d,e,f,g)

これを簡単に行うための提案はありますか?split()を使用できると思いましたが、分割後にwhich()を使用するのに問題があります。私は次のようにaveを使用できます:

foo <- function(x){which(x>0)[1]}
df$t <- ave(df$f,df$d,FUN=foo)

しかし、eの値を見つけるのに苦労しています。どんな助けでも大歓迎です。

4

2 に答える 2

4

他の誰かがベースRソリューションを提供できますが、これをplyrを使用して行う方法は次のとおりです。

> ddply(df,.(d),transform,g = head(e[f != 0],1))
  d e f g
1 1 5 0 7
2 1 6 0 7
3 1 7 1 7
4 2 5 0 6
5 2 6 1 6
6 2 7 0 6
7 3 5 0 7
8 3 6 0 7
9 3 7 1 7

サンプルデータの列に(グループごとに)一意の非ゼロ要素が1つしかない場合でも、文字通り「最初の非ゼロ要素」についてメモしたことに注意してください。

于 2012-06-01T18:02:45.937 に答える
2

これがベースRの方法です

g <- inverse.rle(list(lengths=rle(d)$lengths, values=e[f != 0]))

于 2012-06-01T18:27:38.997 に答える