如何获取所有行中共享和不共享的True和false的数量

Lea*_*ner 2 r

我有这样的数据

df<- structure(list(rowid = 1:12, P = c(TRUE, TRUE, TRUE, TRUE, TRUE, 
TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), T = c(TRUE, TRUE, 
TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE), 
    X = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, 
    FALSE, TRUE, TRUE)), row.names = c(NA, -12L), class = c("tbl_df", 
"tbl", "data.frame"))
Run Code Online (Sandbox Code Playgroud)

当所有行均为True或False或混合时,我试图获取。

所以在这种情况下,就像这样

AllTure  AllFalse  Mixed 
9          0        2
Run Code Online (Sandbox Code Playgroud)

tmf*_*mnk 6

使用dplyr,您可以执行以下操作:

df %>%
 summarise(AllTure = sum(rowSums(.[2:4]) == 3),
           AllFalse = sum(rowSums(.[2:4]) == 0),
           Mixed = n() - (AllFalse + AllTure))

  AllTure AllFalse Mixed
    <int>    <int> <int>
1       9        0     3
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

一个选择是

table(rowSums(df[-1]))
Run Code Online (Sandbox Code Playgroud)

序,以获得预期的标签,我们可以把它转换成factorlevels特定

s1 <- rowSums(df[-1])
table(factor(replace(s1, !s1  %in% c(0, 3), 1), levels = c(0, 1, 3), 
      labels = c("AllFalse", "Mixed", "AllTrue")))
# AllFalse    Mixed  AllTrue 
#      0        3        9 
Run Code Online (Sandbox Code Playgroud)

注意:两种解决方案都只使用 base R


如果在中需要它tidyverse,这是一个无需重塑或多次进行相同计算的选项,则使用获得行的总和reduce,然后将“ Sum”列转换为factor具有levels指定的行,并获得具有的频率count

library(tidyverse)    
df %>%
   transmute(Sum = reduce(.[-1], `+`)) %>% 
   mutate(Sum = factor(recode(Sum, `3` = 'AllTrue', `0`= 'AllFalse', 
       .default = 'Mixed'),
   levels = c("AllTrue", 'AllFalse', 'Mixed'))) %>% 
   count(Sum, .drop = FALSE)
# A tibble: 3 x 2
#  Sum          n
#  <fct>    <int>
#1 AllTrue      9
#2 AllFalse     0
#3 Mixed        3
Run Code Online (Sandbox Code Playgroud)