如何在R中生成列元素组合并跨数据框匹配对应值?
使用dplyr或基础R实现无序组合匹配与取值
需求说明
现有两个单列数据框A、B,需先生成指定的varA/varB组合,再在数据框D中匹配这些组合(不考虑varA和varB的顺序),并获取对应的y值。
原始数据定义
library(tidyverse) # 数据框A、B A = tibble(var = c("A","B")) B = tibble(var = c("A","C")) # 数据框D D = tibble(varA = c("B","A","C","B","D","H"), varB = c("A","A","A","C","F","G"), y = c(1.12,1.14,1.15,1.16,1.23,1.10))
方法一:使用dplyr实现
步骤1:生成目标组合数据框
先合并A、B的所有唯一元素,生成所有不重复的无序组合(含自身配对),并按要求排序:
# 提取所有唯一变量值 all_vars <- unique(c(A$var, B$var)) # 生成目标组合 target_pairs <- expand.grid(varA = all_vars, varB = all_vars) %>% as_tibble() %>% # 筛选出varA <= varB的组合,避免重复无序对 filter(varA <= varB) %>% # 按指定顺序排序 arrange(varA, varB)
执行后得到目标组合:
| varA | varB |
|---|---|
| A | A |
| A | B |
| A | C |
| B | C |
步骤2:匹配D中的无序组合并取值
通过生成排序后的辅助列,统一无序组合的标识,实现不区分顺序的匹配:
result <- target_pairs %>% # 为目标组合添加排序后的辅助列 mutate(var1 = pmin(varA, varB), var2 = pmax(varA, varB)) %>% # 与处理后的D进行连接 left_join( D %>% mutate(var1 = pmin(varA, varB), var2 = pmax(varA, varB)) %>% select(var1, var2, y), by = c("var1", "var2") ) %>% # 移除辅助列,保留目标格式 select(varA, varB, y)
最终结果与预期一致:
| varA | varB | y |
|---|---|---|
| A | A | 1.14 |
| A | B | 1.12 |
| A | C | 1.15 |
| B | C | 1.16 |
方法二:基础R实现
步骤1:生成目标组合
# 提取所有唯一变量值 all_vars <- unique(c(A$var, B$var)) # 生成所有可能组合并筛选 target_pairs <- expand.grid(varA = all_vars, varB = all_vars) target_pairs <- target_pairs[target_pairs$varA <= target_pairs$varB, ] # 排序并重置行名 target_pairs <- target_pairs[order(target_pairs$varA, target_pairs$varB), ] rownames(target_pairs) <- NULL
步骤2:匹配并取值
# 为D添加排序后的辅助列 D$var1 <- pmin(D$varA, D$varB) D$var2 <- pmax(D$varA, D$varB) # 为目标组合添加辅助列 target_pairs$var1 <- pmin(target_pairs$varA, target_pairs$varB) target_pairs$var2 <- pmax(target_pairs$varA, target_pairs$varB) # 合并数据并整理格式 result_base <- merge(target_pairs, D[, c("var1", "var2", "y")], by = c("var1", "var2")) result_base <- result_base[, c("varA", "varB", "y")] result_base <- result_base[order(result_base$varA, result_base$varB), ] rownames(result_base) <- NULL
执行后同样得到预期结果。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

