【发布时间】:2021-05-30 13:00:23
【问题描述】:
感谢你们提出优雅的解决方案!两种解决方案都适用于我,但只有 melt() 和反向连接解决方案适用于带有日期而不是数值的 data.table。
编辑
我通过融合并结合 Wimpel 获得的结果实现了提议的 data.table 解决方案,因为他/她的解决方案也适用于存储在日期列中的日期,而不是最初的玩具数据都是整数值。
我更喜欢 Peace Wang 解决方案的可读性,尽管使用 data.table assignments 和 IMO,它的语法比 melt() 解决方案更清晰,但是(至少对我而言),它不起作用带有日期类型的列。
对数值/整数数据的两种解决方案进行基准测试,发现melt() 解决方案显然是赢家。
编辑 2 如果我实施 Peace Wang 提出的解决方案,要通过转换来复制 NA 值,请参阅下面的输入 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]
不胜感激!
【问题讨论】:
-
dt[,(date_min = colnames(.SD)[apply(.SD,1,which.min)]),.SDcols=!1]
-
感谢您的建议。刚刚关闭了我的电脑。明天早上我会先试一试,然后再报告。
-
了解提议的内部作用,我想知道为什么它给我关于
NAs created through conversion的重复警告... -
dt[,.(date_min = colnames(.SD)[apply(.SD,1,which.min)]),.SDcols=!1]这样会更好,.( )`` meanslist()```。
标签: r data.table