You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:50:40