我想将一个数据框与一个 id 列和一个基于列表名称的列表(包含不同的 id 值)合并。举个例子:
g <- data.frame(id = c("a1", "b2"), k = c(4, 5))
h <- list(a1 = list(
p = c(1, 2, 3),
l = c("A", "B", "C"),
data = mtcars
),
b2 = list(
p = c(5, 6, 7),
l = c("M", "N", "O"),
data = iris
))
如何将 g 和 h(基于 g$id 和 h 的名称)合并到数据帧 g2 中,除了 h 之外还包含 id 和 k 列作为列表列:
# A tibble: 2 × 3
id h k
<fctr> <list> <dbl>
1 a1 <tibble [3*1]> 4
2 b2 <tibble [3*1]> 5
@Steven Beaupré 的回答非常有用。我冒昧地将列表转换为 tibble 方法到函数中,以防其他人需要它。
library(tidyverse)
cnv_list_tibble <- function(ls) {
as_tibble(ls) %>%
gather(id, data) %>%
nest(.,-id)
}
瞧,您有一个可用于后续合并/加入的列表列。
最佳答案
你可以尝试:
library(tidyr)
library(dplyr)
library(tibble)
as_tibble(h) %>%
gather(id, data) %>%
group_by(id) %>%
do(h = as_tibble(.[-1])) %>%
left_join(., g)
这给出:
#Joining, by = "id"
#Source: local data frame [2 x 3]
#Groups: <by row>
#
## A tibble: 2 × 3
# id h k
# <chr> <list> <dbl>
#1 a1 <tibble [3 × 1]> 4
#2 b2 <tibble [3 × 1]> 5
或者使用purrr
:
library(purrr)
as_tibble(h) %>%
gather(id, data) %>%
slice_rows("id") %>%
by_slice(~as_tibble(.), .to = "h") %>%
left_join(., g)
关于r - 将数据框和列表连接到包含列表列的数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112625/