首页 > 解决方案 > 如何在 data.table 中的多个列中使用 ifelse?

问题描述

我在 data.table 中有多个列,我想在其上应用 ifelse 语句。我可以为每一列重复代码,但我想知道是否有更优雅的解决方案

对于给定的数据表,我想使用 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 值

标签: rdata.table

解决方案


我们可以.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]

推荐阅读