我有一个庞大的观察数据集,其中有几个观察行,每个ID有几个不同的变量。 例如
数据
ID V1 V2 V3 time
1 35 100 5.2 2015-07-03 07:49
2 25 111 6.2 2015-04-01 11:52
3 41 120 NA 2015-04-01 14:17
1 25 NA NA 2015-07-03 07:51
2 NA 122 6.2 2015-04-01 11:50
3 40 110 4.1 2015-04-01 14:25
对于每个唯一ID,我想基于时间列独立提取每个变量的最早(第一次)观察。即我想将多个相同ID的行组合在一起,这样每个变量的第一次观察就有一行(时间变量对于所有变量都不相等)。
min()
函数将返回一组观察的最早时间,但问题是我需要为每个变量执行此操作。为此,我尝试使用最短时间的tapply
函数
tapply(Data, ID, min(time)
但是收到错误
" match.fun(FUN)出错: '分钟(数据$时间)'不是功能,角色或符号。
我怀疑还存在一个问题,因为许多观察行都缺少数据。
或者我尝试使用聚合一次一个地执行每个变量,并以这种方式选择min(时间):
firstV1 <-aggregate(V1[min(time)]~ID, data=Data, na.rm=T)
从示例数据集中,我希望看到的是:
Data
ID V1 V2 V3
1 35 100 5.2
2 25 122 6.2
3 41 120 4.1
注意&#39; 25&#39; ID2
V1
来自后来的观察,因为第一次观察失踪了。 ID3
V3
也是如此。
输入数据
structure(list(ID = c(1L, 2L, 3L, 1L, 2L, 3L), V1 = c(35L, 25L,
41L, 25L, NA, 40L), V2 = c(100L, 111L, 120L, NA, 122L, 110L),
V3 = c(5.2, 6.2, 4.2, NA, 6.2, 4.1), time = structure(c(1435906140,
1427885520, 1427894220, 1435906260, 1427885400, 1427894700
), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("ID",
"V1", "V2", "V3", "time"), row.names = c(NA, -6L), class = "data.frame")
答案 0 :(得分:0)
这应该做你需要的。
library(data.table)
Data <- rbind(cbind(1,35,100,5.2,"2015-07-03 07:49"),
cbind(2,25,111,6.2,"2015-04-01 11:52"),
cbind(3,41,120,4.2,"2015-04-01 14:17"),
cbind(1,25,NA,NA,"2015-07-03 07:51"),
cbind(2,NA,122,6.2,"2015-04-01 11:50"),
cbind(3,40,110,4.1,"2015-04-01 14:25"))
colnames(Data) <- c("ID","V1","V2","V3","time")
Data <- data.table(Data)
class(Data[,time])
Data[,time:=as.POSIXct(time)]
minTime.Data <- Data[,lapply(.SD, function(x) x[time==min(time)]),by=ID]
minTime.Data
结果将是
ID V1 V2 V3 time
1: 1 35 100 5.2 2015-07-03 07:49:00
2: 2 NA 122 6.2 2015-04-01 11:50:00
3: 3 41 120 4.2 2015-04-01 14:17:00
请告诉我这是否是您要找的内容,因为您的问题存在一些含糊之处。