【发布时间】:2019-01-30 03:26:54
【问题描述】:
我想应用一个 ifelse 函数循环遍历 2 个向量,然后根据条件更新数据表的列。我正在寻找一种可以处理大量列的解决方案。
我正在通过一个玩具数据集 mtcars 演示这个问题。
library(data.table)
mtcars <- data.table(mtcars)
现在,我想限制某些列的值,并用定义的限制替换相应列的值。但是下面的代码给了我奇怪的结果。
limitlist <- list(c("hp", 300), c("disp", 450.0))
cols <- sapply(limitlist, "[[", 1)
lims <- sapply(limitlist, "[[", 2)
for (i in length(limitlist)) mtcars[, c(cols) := lapply(.SD, function(x){ifelse(x[i] > lims[i], lims[i], x[i])}), .SDcols = cols]
我想要的输出:
range(mtcars$hp)
[1] 52 300
range(mtcars$disp)
[1] 71.1 450.0
我是 data.table 语法的新手,所以可能是一个愚蠢的错误。对此的任何帮助都非常感谢。
【问题讨论】:
-
为什么不直接做
mydata$arr_time <- pmin(2000, mydata$arr_time)? -
@Uwe - 我已经编辑了可重现的示例。不幸的是,
c(col) :=也不起作用。 -
@Andrew - 我正在寻找一种可以在大量列上工作的通用解决方案。
-
setDT(mtcars)抛出错误:无法通过引用将 'mtcars' 转换为 data.table,因为绑定已锁定。 'mtcars' 很可能驻留在已锁定以防止修改其变量绑定的包(或环境)中。尝试将对象复制到当前环境,例如:var -
@Uwe - 感谢您指出这一点。我已经编辑了问题。
标签: r data.table