有条件地聚合数据帧

时间:2013-01-26 14:31:11

标签: r dataframe

我的数据框包含多个主题x中不同时间点y的变量timeid的纵向测量值。但是xy有一些缺失值。

我想要的是聚合数据框,以便对于每个id,我得到第一个定义xy值的时间。 xy将在不同的时间点进行,但无所谓。

testdf<-data.frame(id=c(rep("A",4),rep("B",4),rep("C",4) ), x=c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5), y=rev(c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5)), time=c(1,2,3,4,0.1,0.5,10,20,3,2,1,0.5))

这样testdf会减少到

 id x y
1  A 1 5
2  B 3 1
3  C 5 1

更新:是否有可能允许数据框具有大量变量的解决方案(解决方案或函数,您不必明确定义{{1如果数据框有大量变量,那么变量和x变量?

2 个答案:

答案 0 :(得分:4)

这是一个基础R方法 - 与@ kohske的答案几乎相同的概念,但使用bylapply

首先,您需要按“id”和“时间”订购data.frame(这也适用于@ kohske的回答)。

testdf2 <- testdf[order(testdf$id, testdf$time), ]

do.call(rbind, by(testdf2[2:3], 
                  testdf2$id, 
                  FUN = function(aa) 
                    lapply(aa, function(bb) na.omit(bb)[1])))
#   x y
# A 1 5
# B 3 1
# C 5 1

by的第一部分中,指定要“聚合”的列。

答案 1 :(得分:3)

这是你想要的吗?

> library(plyr)
> ddply(testdf, .(id), summarize, x = na.omit(x)[1], y = na.omit(y)[1])
  id x y
1  A 1 5
2  B 3 1
3  C 2 2

<强>已更新

这是隐式版本。

> ddply(subset(testdf, select = id:y), .(id), colwise(function(z) na.omit(z)[1]))
  id x y
1  A 1 5
2  B 3 1
3  C 2 2