You need to enable JavaScript to run this app. R语言Tidyverse如何实现跨列按行统计满足阈值条件的单元格之和
优惠活动
大模型
产品
解决方案
定价
更多

R语言Tidyverse如何实现跨列按行统计满足阈值条件的单元格之和

Tidyverse 行内跨列条件求和实现

直接给出可复现的完整可运行代码:

library(tidyverse)

# 加载示例数据
df <- tibble(x = c(0.1, 0.2, 0.3, 0.4),
             y = c(0.1, 0.1, 0.2, 0.3),
             z = c(0.1, 0.2, 0.2, 0.2))

# 定义计算阈值
threshold <- 0.15

# 逐行条件求和实现
df %>%
  rowwise() %>%
  mutate(cond_sum = sum(c_across(x:z)[c_across(x:z) >= threshold]))

写法说明

  • 初始伪代码的逻辑偏差:where() 是用来筛选参与计算的列范围的,它的入参是整列的向量,不支持逐行对单元格值做判断,没法直接实现“行内单元格值和阈值比较”的逻辑。
  • 逐行计算的核心逻辑:先用c_across()拿到当前行指定范围内所有单元格值组成的向量,再对这个行向量做逻辑判断,筛出满足阈值要求的元素后求和。
  • 如果不需要手动指定列范围,想自动匹配所有数值列参与计算,可以把列范围替换为where(is.numeric):
    df %>%
      rowwise() %>%
      mutate(cond_sum = sum(c_across(where(is.numeric))[c_across(where(is.numeric)) >= threshold]))
    

高性能替代写法

针对数据量较大的场景,逐行rowwise()的写法性能开销较高,可以直接用矩阵运算实现相同逻辑,执行速度远快于逐行模式:

df %>%
  mutate(cond_sum = rowSums(across(x:z) * (across(x:z) >= threshold)))

运行后输出完全匹配目标预期:

# A tibble: 4 x 4
      x     y     z cond_sum
  <dbl> <dbl> <dbl>    <dbl>
1   0.1   0.1   0.1      0  
2   0.2   0.1   0.2      0.4
3   0.3   0.2   0.2      0.7
4   0.4   0.3   0.2      0.9

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 06:06:07