按ID对子集进行多次观察,然后按时间选择第一次观察

时间:2017-01-21 00:19:28

标签: r subset

我有一个庞大的观察数据集,其中有几个观察行,每个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")

1 个答案:

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

请告诉我这是否是您要找的内容,因为您的问题存在一些含糊之处。