【问题标题】:matching rows between tibbles小标题之间的匹配行
【发布时间】:2019-07-27 22:26:53
【问题描述】:

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

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

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

困难在于无法假设小标题中的变量数量或名称(index 除外),只是小标题之间的名称相同。

示例数据

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)解决方案吗?

【问题讨论】:

  • semi_join(tb2, tb1[-1]),虽然它不会为您重新排序观察结果

标签: r dplyr row matching


【解决方案1】:

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

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

[1] 10  9  6  7  8

【讨论】:

    【解决方案2】:

    使用base的替代方法

    merge(tb1, tb2, by = intersect(names(tb1), names(tb2))[-1])$index.y
    

    【讨论】:

    • 这是一个更简单的版本 - merge(tb1[-1], tb2)$indexby arg 默认为常用列。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多