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

请注意,即使您的示例数据在列(按组)中只有一个唯一的非零元素,我还是按字面意思记下了“第一个非零元素”。

于 2012-06-01T18:02:45.937 回答
2

这是base R中的一种方法

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

于 2012-06-01T18:27:38.997 回答