You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按分组聚合逻辑值数据框:存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:27:20