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
我有 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