匹配R中的多个日期值

use*_*621 4 r matching plyr

我有以下数据框DF描述在某些日期工作过项目的人:

ID    ProjectName    StartDate 
1       Health        3/1/06 18:20
2       Education     2/1/07 15:30
1       Education     5/3/09 9:00
3       Wellness      4/1/10 12:00
2       Health        6/1/11 14:20
Run Code Online (Sandbox Code Playgroud)

目标是找到与每个ID相对应的第一个项目.例如,预期输出如下:

ID    ProjectName    StartDate 
1       Health        3/1/06 18:20
2       Education     2/1/07 15:30
3       Wellness      4/1/10 12:00
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经完成以下操作来获取每个ID的第一个StartDate:

sub <- ddply(DF, .(ID), summarise, st = min(as.POSIXct(StartDate)));
Run Code Online (Sandbox Code Playgroud)

在此之后,我需要将sub中的每一行与原始DF匹配,并提取与该ID和StartDate对应的项目.这可以在sub中的每一行的循环中完成.但是,我的数据集非常大,我想知道是否有一种有效的方法来进行匹配并从DF中提取这个子集.

Mat*_*erg 7

这是一个data.table解决方案,应该非常有效.

DF <- data.frame(ID=c(1,2,1,3,2,1), ProjectName=c('Health', 'Education', 'Education', 'Wellness', 'Health', 'Health'),
             StartDate=c('3/1/06 18:20', '2/1/07 15:30', '5/3/09 9:00', '4/1/10 12:00', '6/1/11 14:20', '1/1/06 11:10'))
Run Code Online (Sandbox Code Playgroud)

请注意,我已经修改了您的数据,最后添加了另一个元素,因此不再对日期进行排序.因此输出不同.

d <- as.data.table(DF)

# Order by StartDate and take the first ID.
# Assumes that your dates are month/day/year.

d[order(as.POSIXct(StartDate, format="%m/%d/%y %H:%M"))][,.SD[1,],by=ID]
##    ID ProjectName    StartDate
## 1:  1      Health 1/1/06 11:10
## 2:  2   Education 2/1/07 15:30
## 3:  3    Wellness 4/1/10 12:00
Run Code Online (Sandbox Code Playgroud)

如果您的日期已经排序(如您的示例所示),这就足够了:

d[,.SD[1,],by=ID]
Run Code Online (Sandbox Code Playgroud)


Sim*_*lon 7

这很简单,match因为match返回:

第二个参数中第一个参数的第一个匹配位置的向量

所以你需要做的就是按日期排序,然后unique用来获取每个ID的一个实例并match找到第一个位置.感谢@MatthewLunberg提供可重现的数据示例:

DF <- DF[ order(as.POSIXct(DF$StartDate, format="%m/%d/%y %H:%M")) , ]
DF[ match( unique( DF$ID ) , DF$ID ) , ]
#  ID ProjectName    StartDate
#6  1      Health 1/1/06 11:10
#2  2   Education 2/1/07 15:30
#4  3    Wellness 4/1/10 12:00
Run Code Online (Sandbox Code Playgroud)

一个优点是它在使用之前保留了原始数据帧的rownumber.我不知道这对你有用.