有没有一种方法可以有效地将两个表与存储在列表格式中的键连接起来
Is there a way to efficiently join two tables with keys stored on a list format
用于说明我的问题的代码示例。
table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2))
table_A <- table_A %>% mutate(A1 = str_split(A1, "/"))
table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas"))
#does not work
#left_join(table_A, table_B)
期望的结果是有一个新的 B1 列
c("apple") 和 c("apple", "bananas") 但显然这段代码不起作用。实际上,列表的范围从没有键到 5 个键长。
很高兴接受任何建议,也许有一种方法可以重新构建数据或问题来优雅地解决它。
我们可以 unnest
list
列,然后再加入
library(dplyr)
library(tidyr)
table_A %>%
unnest(A1) %>%
left_join(table_B)
-输出
# A tibble: 3 x 3
A1 A2 B1
<chr> <int> <chr>
1 a 1 apple
2 a 2 apple
3 b 2 bananas
或者另一种选择是使用 separate_rows
而不是 strsplit
然后执行 join
table_A %>%
separate_rows(A1, sep="/") %>%
left_join(table_B)
一个data.table
选项
> rev(setDT(table_A)[, .(A1 = unlist(A1)), A2])[setDT(table_B), on = .(A1)]
A1 A2 B1
1: a 1 apple
2: a 2 apple
3: b 2 bananas
@akrun:感谢您的回复,这正是我要找的!
为了在 table_C 下得到准确的预期结果,我只是在你的建议中加了一句:
library(dplyr)
library(tidyr)
table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2))
table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas"))
table_C <- table_A %>%
separate_rows(A1, sep="/") %>%
left_join(table_B) %>%
chop(c(A1,B1))
table_C
用于说明我的问题的代码示例。
table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2))
table_A <- table_A %>% mutate(A1 = str_split(A1, "/"))
table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas"))
#does not work
#left_join(table_A, table_B)
期望的结果是有一个新的 B1 列 c("apple") 和 c("apple", "bananas") 但显然这段代码不起作用。实际上,列表的范围从没有键到 5 个键长。 很高兴接受任何建议,也许有一种方法可以重新构建数据或问题来优雅地解决它。
我们可以 unnest
list
列,然后再加入
library(dplyr)
library(tidyr)
table_A %>%
unnest(A1) %>%
left_join(table_B)
-输出
# A tibble: 3 x 3
A1 A2 B1
<chr> <int> <chr>
1 a 1 apple
2 a 2 apple
3 b 2 bananas
或者另一种选择是使用 separate_rows
而不是 strsplit
然后执行 join
table_A %>%
separate_rows(A1, sep="/") %>%
left_join(table_B)
一个data.table
选项
> rev(setDT(table_A)[, .(A1 = unlist(A1)), A2])[setDT(table_B), on = .(A1)]
A1 A2 B1
1: a 1 apple
2: a 2 apple
3: b 2 bananas
@akrun:感谢您的回复,这正是我要找的!
为了在 table_C 下得到准确的预期结果,我只是在你的建议中加了一句:
library(dplyr)
library(tidyr)
table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2))
table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas"))
table_C <- table_A %>%
separate_rows(A1, sep="/") %>%
left_join(table_B) %>%
chop(c(A1,B1))
table_C