如何使用dplyr计算A列与非NA非0列的对应元素求和汇总?
使用dplyr计算指定规则的列总和
问题背景
现有如下数据框:
| A | B | C | D |
|---|---|---|---|
| 1 | 0 | 2.1 | 6.2 |
| 2 | 3.2 | 3.2 | 0 |
| 3 | 4.4 | NA | 8.3 |
| 4 | NA | 0 | 0 |
| 5 | NA | NA | 8.8 |
| 6 | NA | NA | 0 |
| 7 | 30 | 0 | 9.1 |
| 8 | 30 | 6.6 | 0 |
需要实现:计算A列与所有列(包含A列自身)的对应元素之和,但仅保留对应列中该行不为NA且不为0的情况,最终汇总得到各列的总和。理想输出如下:
| A | B | C | D |
|---|---|---|---|
| 72 | 12.6 | 22.9 | 68.4 |
生成数据的R代码:
library(tidyverse) A = seq(1:8) B = c(0,3.2,4.4,NA,NA,NA,NA,NA) C = c(2.1,3.2,NA,0,NA,NA,0,6.6) D = c(6.2,0,8.3,0,8.8,0,9.1,0) table = tibble(A,B,C,D)
用户尝试的代码:
table%>% dplyr::filter(!is.na(A))%>% dplyr::summarise(across(everything(), ~ sum(.x,A),na.rm=TRUE))
解决方案
核心逻辑是针对每一列,先筛选出该列满足“非NA且非0”的行,再计算这些行中A值与当前列值的对应元素之和,最后汇总求和。
使用dplyr的across函数结合条件判断实现:
table %>% summarise(across(everything(), ~ { # 标记当前列有效行:非NA且不等于0 valid <- !is.na(.x) & .x != 0 # 计算有效行的A + 当前列值的总和 sum(A[valid] + .x[valid], na.rm = TRUE) }))
运行后得到的结果与理想输出一致:
| A | B | C | D |
|---|---|---|---|
| 72 | 12.6 | 22.9 | 68.4 |
代码说明
across(everything(), ...):遍历数据框的所有列,对每一列执行自定义操作valid <- !is.na(.x) & .x != 0:筛选当前列中符合要求的行,排除NA和0的情况A[valid] + .x[valid]:提取有效行对应的A值和当前列值,进行元素级相加sum(..., na.rm = TRUE):对相加后的结果求和,na.rm=TRUE是冗余但更健壮的写法(已筛选有效行,不会有NA)
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

