在R中使用长数据格式

时间:2012-06-01 17:55:28

标签: r split

美好的一天,

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的价值。任何帮助表示赞赏。

2 个答案:

答案 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]))