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

R语言如何对匹配指定列名模式的多列按条件行求和

实现方案

你可以直接在across()内部对值做逻辑判断后转数值,再用rowSums()求和即可,代码如下:

sum_ones <- rowSums(across(matches('pattern'), ~ +(.x == 1)), na.rm = TRUE)

如果偏好可读性更强的写法,也可以用ifelse版本:

sum_ones <- rowSums(across(matches('pattern'), ~ifelse(.x == 1, 1, 0)), na.rm = TRUE)

代码逻辑说明

  • 写法+(.x == 1)是将逻辑值直接转为数值:单元格值等于1时返回TRUE转1,其余非1值(0、2、3等)返回FALSE转0,NA参与==判断后仍为NA
  • 配合rowSums()的na.rm = TRUE参数,会自动忽略NA值,等效于将NA按0处理,完全符合需求
  • 示例验证:
    • 序列0、NA、1、1、1、0计算后求和结果为3
    • 序列0、NA、2、3、1、NA计算后求和结果为1
which()适用性说明

which()可以实现该需求,但不推荐使用:

  • 若要用which()需要逐行遍历匹配列,统计值为1的元素个数,代码更冗余,执行效率也低于上述逻辑转数值的向量化写法
  • 不推荐的示例写法:
    sum_ones <- apply(select(df, matches('pattern')), 1, function(x) length(which(x == 1)))
    
    该写法在数据量较大时执行速度明显慢于dplyr+rowSums的方案。
注意事项

不要用sum作为变量名,sum是R内置的求和函数,重名会导致后续调用内置函数时出现冲突,建议替换为sum_ones这类自定义名称。


内容的提问来源于stack exchange,提问作者MLE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:04