我的数据
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))
我想要的输出(注意:一个df,保留所有列!):
ID c1 c2 myDate
A 3 3 03.01.2014
B 4 4 09.09.2009
C 6 6 06.06.2011
....
我的代码
library(data.table)
setDT(df1)
df1[,myDate:=as.Date(myDate, "%d.%m.%Y")]
test2 <- df1[,.(myDate == min(myDate)), by = ID]
这使我在相应的列(myDate)中符合条件的逻辑。但是,那不是df
而是所有其他列都会丢失。我对data.table
包很新,所以任何帮助都会受到赞赏。
答案 0 :(得分:4)
我们可以使用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
如果存在关联且我们需要所有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
其他选项是获取行索引(.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