簡體   English   中英

如何使用 R 中多列的相同條件計算 data.table 中的行數

[英]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 ) 的子集,創建一個邏輯向量並使用Reducelist簡化為單個向量

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 NoNo Yes NoYes Yes No

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM