我有这样的数据
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)
使用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)
一个选择是
table(rowSums(df[-1]))
Run Code Online (Sandbox Code Playgroud)
序,以获得预期的标签,我们可以把它转换成factor与levels特定
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)