[英]How to count number of rows in data.table using same condition on multiple columns in R
如果我在 R 中有以下數據表
dt <- data.table(x = c("No", "No", "Yes")
, y = c("No", "Yes", "Yes")
, z = c("No", "No", "No")
, q = c("Hi", "Where, "When")
, AA = c(1, 1,1)
, ID = c(999, 789, 567)
, bop = c(2345, 2222,2222))
我想以以下格式獲取每個變量(x,y,z)中“否”的計數
Variable Type Count
x No 2
y No 1
z No 3
我無法將相同的過濾器傳遞給我想要的列。 我只能將過濾器傳遞給一列
dt[, .(.N), by = .(x,y,z)]
我們可以用melt
將reshape成'long'格式,然后通過'variable'(即列名column)進行分組,通過對邏輯向量sum
得到'No'的個數( 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
的情況下,我們可以遍歷 Data.table ( .SD
) 的子集,創建一個邏輯向量並使用Reduce
將list
簡化為單個向量
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.