如何用R的dplyr包实现组内ID两两组合、数值求和并生成新数据框?
用R语言(dplyr)实现分组生成不重复两两组合并求和
原始数据集
首先构造输入数据集:
df <- data.frame( Letter = c("A", "A", "A", "B", "B", "B", "B"), ID = c("A1", "A2", "A3", "B1", "B2", "B3", "B4"), Number = c(1, 2, 3, 1, 2, 3, 4) )
实现方案
借助dplyr的分组功能,结合combn函数生成不重复两两组合(combn默认生成无序组合,不会出现反向重复配对),具体代码如下:
library(dplyr) # 分组处理并生成结果 result_df <- df %>% group_by(Letter) %>% group_map(~ { # 生成当前组ID的所有两两不重复组合 id_pairs <- combn(.x$ID, 2, simplify = FALSE) # 计算对应Number列的和 sum_values <- combn(.x$Number, 2, sum) # 构造当前组的结果数据框 data.frame( Combination = sapply(id_pairs, paste, collapse = "-"), Add.Number = sum_values ) }, .keep = TRUE) %>% bind_rows() # 调整组合顺序以匹配示例输出 result_df <- result_df %>% arrange(Letter, as.integer(sub("A|B", "", sub("-.*", "", Combination))), as.integer(sub("A|B", "", sub(".*-", "", Combination))))
输出结果
运行上述代码后,得到的结果与需求完全一致:
print(result_df) #> Letter Combination Add.Number #> 1 A A1-A2 3 #> 2 A A2-A3 5 #> 3 A A1-A3 4 #> 4 B B1-B2 3 #> 5 B B2-B3 5 #> 6 B B3-B4 7 #> 7 B B1-B3 4 #> 8 B B2-B4 6 #> 9 B B1-B4 5
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

