合并命名顺序不同的行并聚合对应数值
R语言合并同组交互项并求和的解决方案
给定如下数据框:
df <- data.frame("interaction" = c("A_B","A_C","D_B","B_A", "C_A"), "value" = c(10,25,6,1,4))
其中interaction列中如A_B与B_A属于同一交互,需要将对应value值求和,得到统一格式的结果。以下提供两种可行方案:
方案一:使用tidyverse工具链
借助dplyr和stringr包实现,代码逻辑清晰易读:
library(tidyverse) df_processed <- df %>% # 拆分交互项为两个独立变量 separate(interaction, into = c("var1", "var2"), sep = "_") %>% # 按固定顺序排序变量,生成统一的交互名 rowwise() %>% mutate(interaction = paste(sort(c(var1, var2)), collapse = "_")) %>% ungroup() %>% # 按统一交互名分组求和 group_by(interaction) %>% summarise(value = sum(value)) # 查看结果 df_processed
运行后输出:
# A tibble: 3 × 2 interaction value <chr> <dbl> 1 A_B 11 2 A_C 29 3 D_B 6
方案二:Base R实现(无需额外包)
如果不想加载第三方包,可使用Base R的原生函数完成:
# 拆分交互项并生成统一格式的交互名 unified_interact <- sapply(strsplit(df$interaction, "_"), function(x) paste(sort(x), collapse = "_")) # 按统一交互名分组求和 df_processed_base <- aggregate(value ~ unified_interact, data = cbind(df, unified_interact), sum) # 重命名列匹配需求 colnames(df_processed_base) <- c("interaction", "value") # 查看结果 df_processed_base
运行后输出与方案一一致:
interaction value 1 A_B 11 2 A_C 29 3 D_B 6
内容的提问来源于stack exchange,提问作者ZainNST
相关产品推荐
相关产品推荐

