分组并使用data.table选择最短日期

Sto*_*ace 3 r data.table

我的资料

df1 <- structure(list(ID = c("A", "A", "A", "B", "B", "C"), c1 = 1:6, 
c2 = 1:6, myDate = c("01.01.2015", "02.02.2014", "03.01.2014", 
"09.09.2009", "10.10.2010", "06.06.2011")), .Names = c("ID", 
"c1", "c2", "myDate"), class = "data.frame", row.names = c(NA,-6L))
Run Code Online (Sandbox Code Playgroud)

我想要的输出(注意:a df,保留所有列!):

ID    c1    c2    myDate
A     3     3     03.01.2014
B     4     4     09.09.2009
C     6     6     06.06.2011
....
Run Code Online (Sandbox Code Playgroud)

我的密码

library(data.table)
setDT(df1)
df1[,myDate:=as.Date(myDate, "%d.%m.%Y")]
test2 <- df1[,.(myDate == min(myDate)), by = ID]
Run Code Online (Sandbox Code Playgroud)

这使我在相应的列(myDate)中逻辑匹配条件。但是,那还不df是,其他所有列都将丢失。我是该data.table软件包的新手,因此将不胜感激。

akr*_*run 8

我们可以which.min用来获取索引,并.SD用来获取Data.table的子集。

setDT(df1)[, .SD[which.min(as.Date(myDate, '%d.%m.%Y'))], by = ID]
#   ID c1 c2     myDate
#1:  A  3  3 03.01.2014
#2:  B  4  4 09.09.2009
#3:  C  6  6 06.06.2011
Run Code Online (Sandbox Code Playgroud)

或者如果存在联系并且我们需要所有min值行,请使用==

setDT(df1)[, {tmp <- as.Date(myDate, '%d.%m.%Y'); .SD[tmp==min(tmp)] }, ID]
#ID c1 c2     myDate
#1:  A  3  3 03.01.2014
#2:  B  4  4 09.09.2009
#3:  C  6  6 06.06.2011
Run Code Online (Sandbox Code Playgroud)

另一种选择是获取行索引(.I),然后获取子集。会很快

setDT(df1)[df1[, .I[which.min(as.Date(myDate, '%d.%m.%Y'))], ID]$V1]
# ID c1 c2     myDate
#1:  A  3  3 03.01.2014
#2:  B  4  4 09.09.2009
#3:  C  6  6 06.06.2011
Run Code Online (Sandbox Code Playgroud)