R语言生成数据框唯一不重复行对组合问题求助
R 生成数据框唯一行两两配对的解决方案
问题背景
需要对现有带First_前缀列的数据框生成所有不重复的行对,配对的第二个行字段统一以Second_为前缀区分。
可行实现代码
基础R版本(无需额外安装包)
# 1. 构造示例数据(你可以替换为自己的数据框) df <- structure(list(First_ID = c(1L, 2L, 4L, 5L, 6L, 8L, 9L, 20L), First_Lat = c(14.60543375, 14.60928364, 14.60928364, 14.55621093, 14.50756, 14.5802, 14.5802, 14.66019), First_Lon = c(-90.53911871, -90.53998477, -90.53998477, -90.54753174, -90.47934, -90.54794, -90.54794, -90.49326), First_11.Territrorios = c("Guate", "Guate", "Guate", "Guate", "Guate", "Guate", "Guate", "Guate")), class = "data.frame", row.names = c(NA, -8L)) # 2. 生成所有不重复的行索引配对(i<j,无重复逆序对) row_pairs <- combn(nrow(df), 2, simplify = FALSE) # 3. 预定义第二个配对行的列名(统一替换前缀为Second_) second_cols <- sub("^First_", "Second_", colnames(df)) # 4. 遍历所有配对合并为最终数据框 result <- do.call(rbind, lapply(row_pairs, function(idx) { cbind(df[idx[1], ], setNames(df[idx[2], ], second_cols)) })) # 5. 重置行号(可选) rownames(result) <- NULL
Tidyverse 版本(适合习惯dplyr语法的用户)
library(tidyverse) result <- combn(nrow(df), 2, simplify = FALSE) %>% map_dfr(~ bind_cols( slice(df, .x[1]), slice(df, .x[2]) %>% rename_with(~ sub("^First_", "Second_", .x)) ))
报错原因说明
你使用expand.grid报错是因为该函数本身是用来生成多个向量的笛卡尔积,直接传入数据框会触发类型匹配错误,且该函数会生成包含逆序对、自配对的所有排列,还要额外过滤去重,不适合当前需求。
用combn是正确的方向,只需要对生成的配对列表做遍历合并即可得到完整数据框。
内容的提问来源于stack exchange,提问作者MelaniaCB
相关产品推荐
相关产品推荐

