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

在R语言中合并DataFrame行并对N求和(含产品列顺序颠倒情况)

解决R语言中合并Product顺序颠倒行并求和的问题

先看原始数据:

df <- data.frame(
  N = c(20,10,5,5,3),
  Product1 = c('Orange', 'Apple', 'Banana', 'Pear')[c(1,2,1,3,3)],
  Product2 = c('Orange', 'Apple', 'Banana', 'Pear')[c(2,1,3,1,4)]
)

原始数据输出:

N Product1 Product2
1 20   Orange     Apple
2 10    Apple    Orange
3  5   Orange    Banana
4  5     Pear    Orange
5  3     Pear      Pear

核心需求:将Product1与Product2内容一致(顺序颠倒也视为一致)的行合并,对N列求和。比如Orange-Apple和Apple-Orange需合并为一行,N求和为30。

方法一:Base R实现

思路:先对每行的两个Product列做标准化排序,生成统一顺序的新列,再按新列分组求和:

# 对每行的Product1、Product2排序,生成标准化列
df$prod_min <- apply(df[,c("Product1","Product2")], 1, function(x) sort(x)[1])
df$prod_max <- apply(df[,c("Product1","Product2")], 1, function(x) sort(x)[2])

# 按标准化列分组,对N求和
result_base <- aggregate(N ~ prod_min + prod_max, data = df, sum)

# 重命名列,还原为类似原数据的格式
colnames(result_base) <- c("Product1", "Product2", "Total_N")

最终结果:

Product1 Product2 Total_N
1    Apple    Orange      30
2   Orange    Banana       5
3   Orange      Pear       5
4     Pear      Pear       3

方法二:dplyr(tidyverse)实现

用tidyverse系列函数实现,逻辑与Base R一致,代码更简洁:

library(dplyr)

result_dplyr <- df %>%
  rowwise() %>%
  # 生成排序后的标准化列
  mutate(
    prod_min = sort(c(Product1, Product2))[1],
    prod_max = sort(c(Product1, Product2))[2]
  ) %>%
  ungroup() %>%
  # 按标准化列分组求和
  group_by(prod_min, prod_max) %>%
  summarise(Total_N = sum(N), .groups = "drop") %>%
  # 重命名列
  rename(Product1 = prod_min, Product2 = prod_max)

输出结果与Base R方法完全一致。

内容的提问来源于stack exchange,提问作者daffer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:16:02