![](/img/trans.png)
[英]How to combine multiple columns into one column and attach their unique code in R?
[英]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.