在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
相关产品推荐
相关产品推荐

