美好的一天,
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的价值。任何帮助表示赞赏。
答案 0 :(得分: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 :(得分:2)
这是基础R的方式
g <- inverse.rle(list(lengths=rle(d)$lengths, values=e[f != 0]))