如何通过匹配相同字符串合并不等长的tibble列
实现两个不等长tibble的匹配对齐
问题
给定两个含唯一值的不等长tibble:
df1 <- structure(list(col1 = c("A", "T", "C", "D", "X", "F")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L)) df2 <- structure(list(col2 = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))
需要生成一个新tibble,满足:
- 两个表中相同的字符串显示在同一行
- 仅在单个表中存在的字符串,对应另一列填充
NA - 最终顺序与示例一致
解决方案
使用dplyr的全连接功能,结合自定义排序实现:
1. 加载依赖包
library(dplyr)
2. 统一匹配列并执行全连接
先为两个表添加用于匹配的辅助列,再执行全连接:
# 为df1添加匹配列 df1 <- df1 %>% mutate(match_val = col1) # 为df2添加匹配列 df2 <- df2 %>% mutate(match_val = col2) # 全连接,保留所有行 df_joined <- full_join(df1, df2, by = "match_val")
3. 按目标顺序排序
根据示例的预期顺序,构建自定义排序因子,然后重新排列行:
# 定义目标顺序的向量 target_order <- c("A", "B", "T", "C", "D", "X", "F", "G", "H", "I", "J") # 按自定义顺序排序,移除辅助列 df3 <- df_joined %>% arrange(factor(match_val, levels = target_order)) %>% select(col1, col2)
4. 查看结果
df3 #> # A tibble: 11 × 2 #> col1 col2 #> <chr> <chr> #> 1 A A #> 2 NA B #> 3 T NA #> 4 C C #> 5 D D #> 6 X NA #> 7 F F #> 8 NA G #> 9 NA H #> 10 NA I #> 11 NA J
通用排序版本(无需指定固定顺序)
如果不需要严格遵循示例的特定顺序,仅需保证相同值同行,可以按字母顺序排序:
df3_general <- df_joined %>% arrange(match_val) %>% select(col1, col2)
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

