You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过匹配相同字符串合并不等长的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:17:37