如何快速为R数据框添加成对后续行求和的新列
R数据框添加分组求和列的多种实现方案
原始数据框
你的数据框结构如下:
df <- structure(list(Var1 = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("0", "1"), class = "factor"), Var2 = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("congruent", "incongruent"), class = "factor"), Var3 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("spoken", "written"), class = "factor"), Freq = c(8L, 2L, 10L, 2L, 10L, 2L, 10L, 2L)), class = "data.frame", row.names = c(NA, -8L))
需求
添加一列Freq_sum,记录每对(Var1为"0"和"1"、Var2+Var3相同的两行)的Freq之和,结果放在每对的第一行(Var1="0"的行),第二行留空(NA)。
你的现有实现(参考)
Table = as.data.frame(table(data_1$unimodal,data_1$cong_cond, data_1$presentation_mode)) %>% mutate(Var1 = factor(Var1, levels = c('0', '1'))) row = Table %>% summarise(across(where(is.numeric), ~ .[Var1 == '0'] + .[Var1 == '1'], .names = "{.col}_sum")) column = c(rbind(row$Freq_sum,rep(NA, 4))) Table$column = column
更简洁的dplyr实现
直接通过分组+条件赋值一步完成,无需拆分代码:
library(dplyr) df <- df %>% group_by(Var2, Var3) %>% # 按Var2和Var3分组,每组对应一对行 mutate(Freq_sum = if_else(Var1 == "0", sum(Freq), NA_integer_)) %>% # 仅给Var1=0的行赋值求和结果 ungroup()
使用purrr::map的实现
利用purrr的遍历函数处理每个分组:
library(purrr) library(dplyr) # 初始化求和列为NA df$Freq_sum <- NA_integer_ # 获取所有唯一的Var2+Var3组合 groups <- unique(df %>% select(Var2, Var3)) # 遍历每个分组,计算总和并赋值 walk2(groups$Var2, groups$Var3, function(v2, v3) { total <- df %>% filter(Var2 == v2, Var3 == v3) %>% pull(Freq) %>% sum() df[df$Var2 == v2 & df$Var3 == v3 & df$Var1 == "0", "Freq_sum"] <<- total })
使用for循环的实现
最基础的循环方式,适合理解底层逻辑:
# 初始化求和列为NA df$Freq_sum <- NA_integer_ # 生成唯一分组标识(用下划线拼接Var2和Var3) unique_groups <- unique(paste(df$Var2, df$Var3, sep = "_")) for (group in unique_groups) { # 拆分分组标识,得到Var2和Var3的值 v2 <- strsplit(group, "_")[[1]][1] v3 <- strsplit(group, "_")[[1]][2] # 计算当前分组的Freq总和 total_sum <- sum(df$Freq[df$Var2 == v2 & df$Var3 == v3]) # 将总和赋值给分组内Var1=0的行 df$Freq_sum[df$Var2 == v2 & df$Var3 == v3 & df$Var1 == "0"] <- total_sum }
最优方案推荐
优先选择dplyr分组mutate的实现:代码简洁易读,dplyr内部做了性能优化,处理大型数据框时效率也有保障,是这类结构化数据处理的标准方案。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

