使用所选列中的所有值的最大值有条件地更新某些列(data.table,r)

inf*_*keR 3 r data.table

我有900,000 x 500类型的数据集,但下面显示了适合该问题的玩具数据集.

library(data.table)
df1 <- data.table(x = c(1,2,4,0), y = c(0,0,10,15), z = c(1,1,1,0))
Run Code Online (Sandbox Code Playgroud)

我想做以下事情:

  1. 对于y和z列
  2. 选择行的值= 0
  3. 用max + 1替换它们,其中max是在整个列上计算的

我是data.table的新手.在stackoverflow上查看问题的示例,我找不到类似的问题,除了这个: 如何替换表*中的NA值用于所选列*?data.frame,data.table

我自己的尝试如下,但这不起作用:

for (col in c("x", "y")) df1[(get(col)) == 0, (col) := max(col) + 1)
Run Code Online (Sandbox Code Playgroud)

显然,我还没有习惯data.table,所以我现在正撞在墙上......

如果有人能提供dplyr解决方案data.table,我会很感激.

akr*_*run 6

我们可以使用set和分配值为0的行max和该列+1.

 for(j in c("y", "z")){
    set(df1, i= which(!df1[[j]]), j=j, value= max(df1[[j]])+1)
 }

df1
#   x  y z
#1: 1 16 1
#2: 2 16 1
#3: 4 10 1
#4: 0 15 2
Run Code Online (Sandbox Code Playgroud)

注意:该set方法将非常有效,因为[.data.table避免了开销


或者,效率较低的方法是指定感兴趣的列.SDcols,循环遍历columns(lapply(..),replace基于逻辑索引的值,并将:=输出赋值()返回列.

df1[, c('y', 'z') := lapply(.SD, function(x) 
         replace(x, !x, max(x)+1)), .SDcols= y:z]
Run Code Online (Sandbox Code Playgroud)