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
相关产品推荐
相关产品推荐

