如何用dplyr将指定行列求和结果赋值给特定行并保留其余数据
使用dplyr实现指定行的求和赋值
以下是两种更简洁的dplyr实现方案,满足你的需求:
方案一:用across批量处理多列
library(dplyr) # 初始化数据框 df <- data.frame(num1 = c('a', 'b', 'c', 'd'), num2 = c(1, 2, 3, 4), num3 = c(5, 6, 7, 8), num4 = c('x', 'y', 'b', 'd')) # 完成求和赋值 df <- df %>% mutate( # 对num2、num3列批量处理 across(c(num2, num3), ~if_else(num1 == 'a', # 计算num1为a/b/c的当前列总和 sum(.x[num1 %in% c('a', 'b', 'c')]), # 其他行保留原值 .x)) )
执行后得到的结果:
print(df) # num1 num2 num3 num4 # 1 a 10 26 x # 2 b 2 6 y # 3 c 3 7 b # 4 d 4 8 d
这个方案通过across一次性处理目标列,避免了重复编写mutate语句,逻辑更紧凑。
方案二:用rows_update直接匹配更新
library(dplyr) df <- data.frame(num1 = c('a', 'b', 'c', 'd'), num2 = c(1, 2, 3, 4), num3 = c(5, 6, 7, 8), num4 = c('x', 'y', 'b', 'd')) # 先计算a/b/c行的num2、num3总和,生成仅包含a行的更新数据集 sum_vals <- df %>% filter(num1 %in% c('a', 'b', 'c')) %>% summarise(num1 = 'a', across(c(num2, num3), sum)) # 将sum_vals的值更新到原数据框的对应行 df <- df %>% rows_update(sum_vals, by = "num1", unmatched = "ignore")
这个方案先单独计算需要更新的值,再通过rows_update精准匹配num1='a'的行进行替换,逻辑更直观,适合需要复用汇总值的场景。
内容的提问来源于stack exchange,提问作者Dre Day
相关产品推荐
相关产品推荐

