R - data.table 将作为行的最小值的列的名称分配给新列

瞄准波特21

感谢你们提出了优雅的解决方案!两种解决方案都对我melt()有用,但只有和 back-join 解决方案适用于带有日期而不是数值的 data.table。

编辑

通过融合和连接从 Wimpel获得的结果实现建议的data.table 解决方案,因为他/她的解决方案也适用于存储在日期列中的日期,而不是所有整数值的初始玩具数据。

我更喜欢 Peace Wang 解决方案的可读性,尽管使用data.table 赋值和 IMO,它的语法比melt()解决方案更清晰,但是(至少对我而言),它不适用于日期类型的列。

对数字/整数数据的两种解决方案进行基准测试,认为该melt()解决方案是明显的赢家。


编辑 2要通过转换来复制 NA 值,如果我实现了 Peace Wang 提出的解决方案,请参阅下面的输入 data.table 的更正版本。

我有这样的事情:想象一个患者记录列表,其中包含在不同日期进行的测量。日期列的列名将类似于“2020-12-15”/“2021-01-15”等。

 ID   Date_1       Date_2      Date_3   
  1   1990-01-01   1990-02-01  1990-03-01      
  2   1990-01-01   1990-02-01  1990-03-01       
  3   1990-01-01   1982-02-01  1990-03-01 

我已经确定了 data.table 中每一行的最小值,dt如下所示:

dt <- dt[, Min := do.call(pmin, c(.SD, list(na.rm = TRUE))), .SDcols = -(1)]

到目前为止一切顺利。现在我想添加一个新的 col 来Min_Date说明每行找到的最小值的相应 col 名称(在我的示例中也称为日期),最终得到这样的:

  ID   Date_1       Date_2      Date_3        Min        Min_Date
  1    1990-01-01   1990-02-01  1990-03-01   1990-01-01  Date_1
  2    1990-01-01   1990-02-01  1990-03-01   1990-01-01  Date_1
  3    1990-01-01   1982-02-01  1990-03-01   1982-02-01  Date_2

我尝试了以下变体:

dt <- dt[, Min_Date := do.call(which.pmin, c(.SD, list(na.rm = TRUE))),
                           .SDcols = (2:4)]

然后尝试用 col 索引做某事。还不太了解我的方法.I,但是在以下方面使用时我无法使其工作:

exclusions.dt[exclusions.dt[, .I[which.min(.SD)], ISSUE_ID, .SDcols = (2:6)]$V1]

将不胜感激任何指针!

三角旗

这是另一种data.table方法

#sample data
library( data.table )
DT <- fread("ID   Date_1   Date_2   Date_3   
  1    100      200      300      
  2    100      500      300      
  3    200      150      400    ")

#melt to long format and get rows with minimum value by ID
DT.min <- melt( DT, id.vars = "ID" )[ , .SD[ which.min(value) ], by = ID]
#    ID variable value
# 1:  1   Date_1   100
# 2:  2   Date_1   100
# 3:  3   Date_2   150

#join back to DT
DT[ DT.min, `:=`( Min = i.value, Min_Date = i.variable ), on = .(ID)][]
#    ID Date_1 Date_2 Date_3 Min Min_Date
# 1:  1    100    200    300 100   Date_1
# 2:  2    100    500    300 100   Date_1
# 3:  3    200    150    400 150   Date_2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章