我的数据框包含多个主题x
中不同时间点y
的变量time
和id
的纵向测量值。但是x
和y
有一些缺失值。
我想要的是聚合数据框,以便对于每个id,我得到第一个定义x
和y
值的时间。 x
和y
将在不同的时间点进行,但无所谓。
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
变量?
答案 0 :(得分:4)
这是一个基础R方法 - 与@ kohske的答案几乎相同的概念,但使用by
和lapply
。
首先,您需要按“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