如何在data.table的多个列中使用ifelse?

时间:2019-07-19 03:54:01

标签: r data.table

我想在其中应用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值

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]
相关问题