【发布时间】:2017-07-20 15:08:32
【问题描述】:
在 R 中,我有一个包含诊断值的列(“prncl_diag”)的数据表。这些诊断值(在 prncl_diag 列中)也都显示为数据表中的列。大约有 2.5K 诊断列,其中的一个子集作为值显示在“prncl_diag”列中。
如果诊断指示符的名称出现在“prncl_diag”列的给定行中,我想用 1 更新诊断指示符列。
解释得不是很好,但这是一个最小的工作示例。
dt <- data.table(heart_failure = c(0, 1, 0),
kidney_failure = c(1, 0, 0),
death = c(1, 1, 1),
prncl_diag = c('heart_failure', 'kidney_failure', 'death'))
for (i in 1:nrow(dt)) {
name <- dt[i, prncl_diag]
dt <- dt[i, eval(name) := 1]
}
此代码有效并将“heart_failure”的第 1 行更新为 1,将“kidney_failure”的第 2 行更新为 1,并且不会更改“death”列的第 3 行,因为它已经是 1。
但是,对于 5M 行的数据表,代码很慢,我知道我没有使用 data.table 的结构。
请提供更有效的解决方案。有兴趣从 StackOverflow 社区了解 R、data.table 和效率。
【问题讨论】:
-
一个有效的
base R选项是setDF(dt); dt[cbind(1:nrow(dt), match(dt$prncl_diag, names(dt)))] <- 1
标签: r performance data.table