按分组聚合逻辑值数据框:存在TRUE则保留TRUE的实现方法
按组聚合逻辑值列:存在TRUE则保留TRUE的实现方法
原始数据
构造数据的代码:
dataf <- tibble(A = sample(c(TRUE, FALSE), 10, replace = T), B = sample(c(TRUE, FALSE), 10, replace = T), C = sample(c(TRUE, FALSE), 10, replace = T), group = c(rep("grp1", 3), rep("grp2", 3), rep("grp3", 4)))
数据预览:
> dataf # A tibble: 10 × 4 A B C group <lgl> <lgl> <lgl> <chr> 1 TRUE TRUE TRUE grp1 2 FALSE TRUE TRUE grp1 3 TRUE TRUE TRUE grp1 4 TRUE TRUE TRUE grp2 5 FALSE TRUE TRUE grp2 6 TRUE FALSE TRUE grp2 7 TRUE FALSE FALSE grp3 8 TRUE FALSE TRUE grp3 9 FALSE FALSE TRUE grp3 10 FALSE FALSE FALSE grp3
需求说明
按group变量分组聚合,规则为:每组内某列只要存在至少一个TRUE,聚合后该列对应分组的值为TRUE;若全为FALSE,则为FALSE。期望结果如下:
# A tibble: 3 × 4 A B C group <lgl> <lgl> <lgl> <chr> 1 TRUE TRUE TRUE grp1 2 TRUE TRUE TRUE grp2 3 TRUE FALSE TRUE grp3
解决方案
方法1:dplyr批量处理(tidyverse风格)
用group_by()分组,across()批量指定要处理的列,any()函数直接满足“存在TRUE即返回TRUE”的需求:
library(dplyr) dataf %>% group_by(group) %>% summarise(across(A:C, any), .groups = "drop")
.groups = "drop"用于取消分组状态,得到普通的tibble;如果省略,结果会保留分组属性。
方法2:data.table高效处理(适合大数据)
如果数据量较大,data.table的聚合速度更有优势:
library(data.table) setDT(dataf)[, lapply(.SD, any), by = group, .SDcols = A:C]
.SDcols指定需要聚合的列,lapply(.SD, any)对每个目标列应用any()判断。
方法3:Base R原生实现
无需加载额外包,用aggregate()即可完成:
aggregate(. ~ group, data = dataf, FUN = any)
. ~ group表示以group为分组依据,对其余所有列应用any()函数。
内容的提问来源于stack exchange,提问作者JontroPothon
相关产品推荐
相关产品推荐

