【问题标题】:Group by and select min date with data.table使用 data.table 分组并选择最小日期
【发布时间】:2015-10-30 13:01:56
【问题描述】:

我的数据

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 包还很陌生,因此我们将不胜感激。

【问题讨论】:

标签: r data.table


【解决方案1】:

我们可以使用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

【讨论】:

  • 整洁。你能指出我可以阅读更多关于ISD的地方吗
  • @Chrissi 尝试herehere 了解更多信息。
  • 嗨@akrun,如果我需要在几列中找到最小值,你有什么建议吗?
  • @JantjeHouten 试试df1 %&gt;% summarise(across(yourcolumns, min))
  • @akrun 谢谢你,如果我有一个分组,我假设在总结之前分组不好?你有data.table的解决方案吗?我想也许它涉及使用.SDcols?我目前有这样的东西: tmp = tmp[, min(.SD, na.rm = TRUE), by = .(DCOF_ID, PRESCRIBED_DATE, DRUG_NAME), .SDcols = c("DOSE_BREAKFAST", "DOSE_LUNCH", "DOSE_DINNER ", "DOSE_SUPPER")]
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多