R语言中基于多列阈值条件新增计数列的dplyr解决方案
解决方案
针对你在iris数据集上的需求——新增count列统计列名含"Sepal"的列中值处于1-5之间的列数,这里提供两种无需手动列名的dplyr方案:
方案1:rowwise + c_across(直观易读)
library(dplyr) iris %>% rowwise() %>% mutate(count = sum(c_across(contains("Sepal")) %>% between(1, 5))) %>% ungroup()
contains("Sepal")自动匹配所有列名包含"Sepal"的列,不用手动列举c_across()将选中的列按行转为向量,配合between()判断每个值是否在1-5区间内sum()统计每行中符合条件的列数,最后用ungroup()取消行分组,避免影响后续操作
方案2:向量化方法(高效适合大数据集)
如果你的实际数据集行数/列数较多,推荐用这种无需rowwise的向量化方案,运行效率更高:
iris %>% mutate(count = rowSums(between(select(., contains("Sepal")), 1, 5)))
select(., contains("Sepal"))筛选目标列,between()对整个筛选出的数据框逐元素判断rowSums()直接按行求和,省去行分组的开销
为什么之前的rowwise()+mutate()+if_any不符合预期?
if_any()的作用是判断每行是否存在至少一个符合条件的列,返回的是单个逻辑值(TRUE/FALSE),而不是统计符合条件的列数。要实现计数,需要用sum()来统计每行中符合条件的逻辑值数量。
内容的提问来源于stack exchange,提问作者Pss
相关产品推荐
相关产品推荐

