R 按ID将多个观测值子集,然后选择“按时间第一个观测值”

R 按ID将多个观测值子集,然后选择“按时间第一个观测值”,r,subset,R,Subset,我有一个很大的观察数据集,有几行观察数据,每个ID有几个不同的变量。 e、 g 资料 我想根据时间列为每个唯一ID独立提取每个变量的最早(第一次)观察值。也就是说,我想将相同ID的多行组合在一起,以便每个变量有一行第一次观察值(时间变量不会对所有变量都相等) min()函数将返回一组观察值的最早时间,但问题是我需要为每个变量执行此操作。为此,我已尝试在最短时间内使用tapply功能 tapply(Data, ID, min(time) 但是有一个错误说 “匹配中出错。乐趣(乐趣): “min(

我有一个很大的观察数据集,有几行观察数据,每个ID有几个不同的变量。 e、 g

资料

我想根据时间列为每个唯一ID独立提取每个变量的最早(第一次)观察值。也就是说,我想将相同ID的多行组合在一起,以便每个变量有一行第一次观察值(时间变量不会对所有变量都相等)

min()
函数将返回一组观察值的最早时间,但问题是我需要为每个变量执行此操作。为此,我已尝试在最短时间内使用
tapply
功能

tapply(Data, ID, min(time)
但是有一个错误说

“匹配中出错。乐趣(乐趣): “min(数据$time)”不是函数、字符或符号

我怀疑这也是一个问题,因为许多观测行都缺少数据

或者,我尝试使用聚合一次只处理一个变量,并通过以下方式选择最小值(时间):

firstV1 <-aggregate(V1[min(time)]~ID, data=Data, na.rm=T)
请注意,
ID2
V1
的“25”来自后面的观察,因为缺少第一个观察值。对于
ID3
也一样


输入数据

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")

这应该可以满足你的需要

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

让我知道这是否是您想要的,因为您的问题有点含糊不清。

这应该满足您的需要

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的最早时间的数据行;这就是链接的答案。但是,如果您只需要每个ID的最早时间(即不是整行数据),您可以使用
聚合(time~ID,dat,min)
(尽管您也可以使用链接和子集中的答案)。如果这不是您想要的,请使用小示例数据集的预期结果编辑您的问题。抱歉,我刚刚注意到您的编辑。您的输出有点不清楚,因此您可以从数据中获得您想要的结果。cheers@user20650再次感谢您的帮助。但是,您提供的聚合代码仅适用于ident确定第一次是什么,我需要与此时间相关联的列中的值。但是,如果该值为NA,我需要及时查找下一个观察值并提取该值。可能重复,我要查找每个变量的最短时间,而不是我要提取最早(第一个)的最短时间的行观察需要包含每个ID的最早时间的数据行;这就是链接的答案。但是,如果您只需要每个ID的最早时间(即不是整行数据),您可以使用
聚合(time~ID,dat,min)
(尽管您也可以使用链接和子集中的答案)。如果这不是您想要的,请使用小示例数据集的预期结果编辑您的问题。抱歉,我刚刚注意到您的编辑。您的输出有点不清楚,因此您可以从数据中获得您想要的结果。cheers@user20650再次感谢您的帮助。但是,您提供的聚合代码仅适用于ident确定第一次是什么,我需要与此时间相关的列中的值。但是,如果该值为NA,我需要及时查找下一个观察值并提取该值。感谢您的回复,并指出了类似的文章!我成功地重新创建了您在我的数据中提供的代码,但有两个问题s、 首先,出现了许多ID相同的重复记录(即两行ID相同的记录)。更重要的是,我希望出现第一个值,忽略NAs。因此,在上面的输出中,ID2和V1希望100不是NA,即使它来自另一行。下面是最后的代码:library(data.table)library(zoo)dt感谢您的回复,并指出了类似的文章!我能够成功地重新创建您在我的数据中提供的代码,但是有两个问题。首先,出现了大量ID重复的记录(即具有相同ID的两行)。更重要的是,我希望出现第一个值,忽略NAs。因此,在上面的输出中,ID2和V1我希望100不是NA,即使它来自另一行。下面是最后的代码:library(data.table)library(zoo)DT
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