如何用tidyverse的group_by函数批量统计各组符合条件的Key数量
解决方案:用tidyverse分组统计符合条件的Key数量
我明白你现在的需求是按Group分组,统计每组中至少有一个样本值符合条件的Key数量,之前你是分两组单独处理的,现在想用tidyverse的group_by一次性搞定对吧?下面给你完整的实现方案:
核心代码实现
首先加载tidyverse包,然后用分组+汇总的方式完成统计:
library(tidyverse) input <- tribble( ~Key, ~Group, ~sample1, ~sample2, ~sample3, ~samplen, "a1", "ABC", 0, 0.1, 0.2, 0, "a2", "ABC", 1, 2, 3, 0, "a3", "DEF", 0, 0, 0, 0, "a4", "DEF", 2, 22, 23, 2, "a5", "DEF", 0, 0, 0.1, 0 ) # 按条件统计(匹配你的期望输出:样本值严格>0.1) result <- input %>% group_by(Group) %>% # 对每个Key,检查是否有至少一个样本值>0.1,统计符合条件的数量 summarise(qualified_keys = sum(if_any(starts_with("sample"), ~ .x > 0.1))) %>% ungroup() print(result)
输出结果
运行代码后会得到你期望的输出:
# A tibble: 2 × 2 Group qualified_keys <chr> <int> 1 ABC 2 2 DEF 1
代码解释
group_by(Group):按Group列分组,后续操作在每个组内独立执行;if_any(starts_with("sample"), ~ .x > 0.1):starts_with("sample")自动匹配所有以sample开头的样本列,不用手动指定列名;if_any检查每个Key对应的样本列中,是否至少有一个满足>0.1的条件,返回布尔值(TRUE/FALSE);
sum(...):布尔值会被自动转换为1(TRUE)和0(FALSE),求和后直接得到每组符合条件的Key数量;ungroup():可选操作,取消分组状态,方便后续对结果进行其他处理。
如果你的实际需求是样本值≥0.1,只需要把代码中的> 0.1改成>= 0.1即可,此时DEF组的结果会变成2(因为a5的sample3值为0.1,符合条件)。
内容的提问来源于stack exchange,提问作者ferrelwill
相关产品推荐
相关产品推荐

