Мы можем использовать melt
для преобразования в «длинный» формат, а затем выполнить группировку по «переменной» (т.е. столбцу с именем столбца), получить число «Нет», sum
сопоставив логический вектор ( value == 'No'
)
library(data.table)
melt(dt, id.var = 'q')[, .(Type = 'No', Count = sum(value == 'No')), .(variable)]
# variable Type Count
#1: x No 2
#2: y No 1
#3: z No 3
Для нового примера
melt(dt[, .(x, y, z)], measure = c('x', 'y', 'z'))[,
.(Type = 'No', Count = sum(value == 'No')), .(variable)]
# variable Type Count
#1: x No 2
#2: y No 1
#3: z No 3
Или укажите логическое условие в i
и используйте .N
melt(dt[, .(x, y, z)], measure = c('x', 'y', 'z'))[value == 'No',
.(Type = first(value), Count = .N), variable]
# variable Type Count
#1: x No 2
#2: y No 1
#3: z No 3
Или без melt
ing мы можем l oop поверх Subset of Data.table (.SD
), создать логический вектор и уменьшить list
до одного вектора с Reduce
dt[, .(variable = names(.SD), Type = 'No',
Count = Reduce(`+`, lapply(.SD, `==`, 'No'))), .SDcols = x:z]
# variable Type Count
#1: x No 3
#2: y No 2
#3: z No 1
Или используя rowSums
dt[, .(Variable = names(.SD), Type = 'No',
Count = rowSums(.SD == 'No')), .SDcols = x:z]
В коде OP столбцы группировки были взяты как 'x', 'y', 'z'. Затем, если мы сделаем .N
, он ищет количество строк для каждого уникального набора значений в этих столбцах, и это будет 1 для каждого случая, потому что есть только 1 строка для No No No
, No Yes No
или Yes Yes No