我想将数据框与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的名称)合并到包含id和k列的数据帧g2中,另外h作为list-column:
# A tibble: 2 × 3
id h k
<fctr> <list> <dbl>
1 a1 <tibble [3*1]> 4
2 b2 <tibble [3*1]> 5
@StevenBeaupré的答案是超级有用的。我将自由转换列表转换为一个函数,以防万一其他人需要它。
library(tidyverse)
cnv_list_tibble <- function(ls) {
as_tibble(ls) %>%
gather(id, data) %>%
nest(.,-id)
}
并且您有一个列表列,可用于后续合并/加入。
答案 0 :(得分:2)
你可以尝试:
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)