繁体   English   中英

R - 如何将多个 boolean 列(不知道有多少)合并为一列

[英]R - How to combine multiple boolean columns (don't know how many) into one column

我有一个看起来像这样的数据集:

df1 <- data.frame(
  date = c(20200101, 20200102, 20200103,20200104,20200105,20200106), 
  z_score = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE), 
  mad_score = c(FALSE, TRUE, TRUE, TRUE, TRUE, TRUE),
  history_error = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE),
  manual = c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE)
)

结果需要喜欢:

      date final_result
1 20200101        FALSE
2 20200102         TRUE
3 20200103         TRUE
4 20200104        FALSE
5 20200105        FALSE
6 20200106         TRUE

我可以通过将 boolean 列汇总为长格式来做到这一点:

df1_result <- df1 %>% 
  pivot_longer(!date, names_to = "conditions", values_to = "T_or_F") %>% 
  group_by(date) %>% 
  summarise(T_or_F = as.logical(prod(T_or_F)))

我觉得必须有一种更简单的方法来做到这一点。 我在论坛中搜索了解决方案,发现了很多类似问题的 1-liner。 我只是无法将那些优雅的 1-liner 复制到我的问题中。

这是一个仅使用 base R 的单衬垫

data.frame(df1[1], final_result = apply(df1[-1], 1, \(x) sum(x) == 4))
#>       date final_result
#> 1 20200101        FALSE
#> 2 20200102         TRUE
#> 3 20200103         TRUE
#> 4 20200104        FALSE
#> 5 20200105        FALSE
#> 6 20200106         TRUE

tidyverse中,我们可以使用if_all

library(dplyr)
df1 %>%
   transmute(date, result = if_all(where(is.logical)))

-输出

      date result
1 20200101  FALSE
2 20200102   TRUE
3 20200103   TRUE
4 20200104  FALSE
5 20200105  FALSE
6 20200106   TRUE

不是一个班轮,但我们可以使用rowSums进行计算,然后使用 select 所需的列。 无需 pivot 为长格式。

library(tidyverse)

df1 %>%
  mutate(final_result = rowSums(across(where(is.logical))) == 4) %>%
  select(date, final_result)

Output

      date final_result
1 20200101        FALSE
2 20200102         TRUE
3 20200103         TRUE
4 20200104        FALSE
5 20200105        FALSE
6 20200106         TRUE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM