2

我有包含变量纵向测量的数据框,x并且y在不同的时间点time,在几个主题id中。但是x并且y有一些缺失值。

我想要的是聚合数据框,以便对于每个 id,我得到第一个定义的时间xy值。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

更新:是否有可能允许数据框具有大量变量的解决方案(如果数据框有大量变量,您不必显式定义xy变量的解决方案或函数?

4

2 回答 2

4

这是一个基本的 R 方法——与@kohske 的答案几乎相同的概念,但使用byand lapply

不过,首先,您需要data.frame按“id”和“time”排序(这也适用于@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,指定要“聚合”的列。

于 2013-01-26T15:50:06.273 回答
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
于 2013-01-26T14:36:13.773 回答