tibbles 之间的匹配行

matching rows between tibbles

我有 2 个带有索引列的 tibbles 和 n 个在 2 个 tbs 中具有相同名称的变量:

index   var_1   var_2   ...     var_n
...     ...     ...     ...     ...
...     ...     ...     ...     ...

对于 tb1 中的每一行,tb2 中只有一行具有 var_1 直到 var_n 的匹配值。我的目标是 为 tb1 中的每一行找到 tb2 中那些匹配行的索引值

难点在于无法假设 tibbles 中变量的数量或变量的名称(index 除外),只能假设 tibbles 之间的名称相同。

示例数据

library(tidyverse)
(tb1 <- tibble(index = sample(1:5), alpha = c("A","A","A","B","B"), 
                  bravo = c(1,2,3,1,1), charlie = c("x","x","x","x","y")))

# A tibble: 5 x 4
  index alpha bravo charlie 
  <int> <chr> <dbl> <chr>
1     2 A         1 x    
2     5 A         2 x    
3     4 A         3 x    
4     3 B         1 x    
5     1 B         1 y  

(tb2 <- tibble(index = c(10, 6, 9, 7, 8), alpha = c("A","A","A","B","B"), 
               bravo = c(1,3,2,1,1), charlie = c("x","x","x","x","y")))

# A tibble: 5 x 4
  index alpha bravo charlie 
  <int> <chr> <dbl> <chr>
1    10 A         1 x    
2     6 A         3 x    
3     9 A         2 x    
4     7 B         1 x    
5     8 B         1 y  

预期输出

10, 9, 6, 7, 8

有人可以(最好是 tidyverse)解决这个问题吗?

您可以对所有非索引列执行 inner_join -

inner_join(select(tb1, -index), tb2) %>% 
  pull(index)

[1] 10  9  6  7  8

使用 base

的替代方法
merge(tb1, tb2, by = intersect(names(tb1), names(tb2))[-1])$index.y