У меня есть несколько столбцов в таблице данных, к которым я хотел бы применить оператор 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





Мы могли бы использовать .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]