感谢你们提出了优雅的解决方案!两种解决方案都对我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] 删除。
我来说两句