我想在其中应用ifelse语句的data.table中有多个列。我可以为每一列重复该代码,但我想知道是否有更优雅的解决方案
对于给定的数据表,我想使用ifelse语句更改一些数字列。
以下是数据:
dt = data.table(id = c(101, 102, 103, 104), one_cnt = c(0, 6, 4, 0), two_cnt = c(4, 0, 0, 2))
dt
如果我想手动执行此操作,则可以在所有列中执行此操作
dt$one_cnt = ifelse(dt$one_cnt == 0, 0, 2)
相反,我想选择以下列,并在每列上应用ifelse
colnames(dt)[grepl("cnt", colnames(dt))]
对于one_cnt和two_cnt,0值将以0结尾。非零值将采用1值
答案 0 :(得分:1)
我们可以使用.SDcols
来指定选定的列。
library(data.table)
cols <- grep("cnt", colnames(dt), value = TRUE)
dt[, (cols) := lapply(.SD, function(x) ifelse(x == 0, 0, 2)), .SDcols = cols]
dt
# id one_cnt two_cnt
#1: 101 0 2
#2: 102 2 0
#3: 103 2 0
#4: 104 0 2
通过您的尝试,您将0值替换为0,并将非零值更改为2,但是在您的描述中,您提到要将非零值更改为1,因此我不清楚您的预期输出。如果要将其更改为1,可以执行
dt[, (cols) := lapply(.SD, function(x) as.integer(as.logical(x))), .SDcols = cols]