将数据框和列表加入包含listcolumn

时间:2016-10-18 15:44:13

标签: r list dataframe

我想将数据框与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)
}

并且您有一个列表列,可用于后续合并/加入。

1 个答案:

答案 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)