我有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)
我想做以下事情:
我是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,我会很感激.
我们可以使用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)