如何将列表列表转换为tibble(数据帧)

我有以下列表清单.它包含两个变量:对和基因.对的包含总是带有两个字符串的向量.并且可变基因是可以包含多于1个值的载体.

lol <- list(structure(list(pair = c("BoneMarrow", "Pulmonary"), genes = "PRR11"), .Names = c("pair", 
"genes")), structure(list(pair = c("BoneMarrow", "Umbilical"), 
    genes = "GNB2L1"), .Names = c("pair", "genes")), structure(list(
    pair = c("Pulmonary", "Umbilical"), genes = "ATP1B1"), .Names = c("pair", 
"genes")))


lol
#> [[1]]
#> [[1]]$pair
#> [1] "BoneMarrow" "Pulmonary" 
#> 
#> [[1]]$genes
#> [1] "PRR11"
#> 
#> 
#> [[2]]
#> [[2]]$pair
#> [1] "BoneMarrow" "Umbilical" 
#> 
#> [[2]]$genes
#> [1] "GNB2L1"
#> 
#> 
#> [[3]]
#> [[3]]$pair
#> [1] "Pulmonary" "Umbilical"
#> 
#> [[3]]$genes
#> [1] "ATP1B1"

如何将其转换为此数据帧:

pair1         pair2        genes_vec
BoneMarrow    Pulmonary    PRR11
BoneMarrow    Umbilical    GNB2L1
Pulmonary     Umbilical    ATP1B1

注意,基因变量是一个不是单个字符串的向量.

我最好的尝试是这不能给我想要的东西:

> do.call(rbind, lapply(lol, data.frame, stringsAsFactors=FALSE))
        pair  genes
1 BoneMarrow  PRR11
2  Pulmonary  PRR11
3 BoneMarrow GNB2L1
4  Umbilical GNB2L1
5  Pulmonary ATP1B1
6  Umbilical ATP1B1

更新:

用新的例子来展示基因的载体内容

lol2 <- list(structure(list(pair = c("BoneMarrow", "Pulmonary"), genes = c("GNB2L1", 
"PRR11")), .Names = c("pair", "genes")), structure(list(pair = c("BoneMarrow", 
"Umbilical"), genes = "GNB2L1"), .Names = c("pair", "genes")), 
    structure(list(pair = c("Pulmonary", "Umbilical"), genes = "ATP1B1"), .Names = c("pair", 
    "genes")))

lol2
#> [[1]]
#> [[1]]$pair
#> [1] "BoneMarrow" "Pulmonary" 
#> 
#> [[1]]$genes
#> [1] "GNB2L1" "PRR11" 
#> 
#> 
#> [[2]]
#> [[2]]$pair
#> [1] "BoneMarrow" "Umbilical" 
#> 
#> [[2]]$genes
#> [1] "GNB2L1"
#> 
#> 
#> [[3]]
#> [[3]]$pair
#> [1] "Pulmonary" "Umbilical"
#> 
#> [[3]]$genes
#> [1] "ATP1B1"

预期的产出是:

pair1         pair2        genes_vec
BoneMarrow    Pulmonary    PRR11,GNB2L1
BoneMarrow    Umbilical    GNB2L1
Pulmonary     Umbilical    ATP1B1
最佳答案
使用tidyverse,您可以使用purrr来帮助您

library(dplyr)
library(purrr)

tibble(
  pair = map(lol, "pair"),
  genes_vec = map_chr(lol, "genes")
) %>% 
  mutate(
    pair1 = map_chr(pair, 1),
    pair2 = map_chr(pair, 2) 
  ) %>%
  select(pair1, pair2, genes_vec)
#> # A tibble: 3 x 3
#>        pair1     pair2 genes_vec
#>        <chr>     <chr>     <chr>
#> 1 BoneMarrow Pulmonary     PRR11
#> 2 BoneMarrow Umbilical    GNB2L1
#> 3  Pulmonary Umbilical    ATP1B1

使用第二个示例,只需将map_chr(lol,“genes”)替换为map(lol2,“genes”),因为您希望保留带有列表列的嵌套数据帧.

tibble(
  pair = map(lol2, "pair"),
  genes_vec = map(lol2, "genes")
) %>% 
  mutate(
    pair1 = map_chr(pair, 1),
    pair2 = map_chr(pair, 2) 
  ) %>%
  select(pair1, pair2, genes_vec)
#> # A tibble: 3 x 3
#>        pair1     pair2 genes_vec
#>        <chr>     <chr>    <list>
#> 1 BoneMarrow Pulmonary <chr [2]>
#> 2 BoneMarrow Umbilical <chr [1]>
#> 3  Pulmonary Umbilical <chr [1]>

更通用的方法是使用嵌套的元素并根据需要对它们进行排除

library(dplyr)
library(purrr)
library(tidyr)

tab1 <-lol %>%
  transpose() %>%
  as_tibble() %>%
  mutate(pair = map(pair, ~as_tibble(t(.x)))) %>%
  mutate(pair = map(pair, ~set_names(.x, c("pair1", "pair2"))))
tab1
#> # A tibble: 3 x 2
#>               pair     genes
#>             <list>    <list>
#> 1 <tibble [1 x 2]> <chr [1]>
#> 2 <tibble [1 x 2]> <chr [1]>
#> 3 <tibble [1 x 2]> <chr [1]>

对于lol2,除非列表lol2而不是lol1,否则没有任何变化

tab2 <- lol2 %>%
  transpose() %>%
  as_tibble() %>%
  mutate(pair = map(pair, ~as_tibble(t(.x)))) %>%
  mutate(pair = map(pair, ~set_names(.x, c("pair1", "pair2"))))
tab2
#> # A tibble: 3 x 2
#>               pair     genes
#>             <list>    <list>
#> 1 <tibble [1 x 2]> <chr [2]>
#> 2 <tibble [1 x 2]> <chr [1]>
#> 3 <tibble [1 x 2]> <chr [1]>

然后,您可以取消所需的列

tab1 %>%
  unnest()
#> # A tibble: 3 x 3
#>    genes      pair1     pair2
#>    <chr>      <chr>     <chr>
#> 1  PRR11 BoneMarrow Pulmonary
#> 2 GNB2L1 BoneMarrow Umbilical
#> 3 ATP1B1  Pulmonary Umbilical

tab2 %>% 
  unnest(pair)
#> # A tibble: 3 x 3
#>       genes      pair1     pair2
#>      <list>      <chr>     <chr>
#> 1 <chr [2]> BoneMarrow Pulmonary
#> 2 <chr [1]> BoneMarrow Umbilical
#> 3 <chr [1]>  Pulmonary Umbilical

转载注明原文:如何将列表列表转换为tibble(数据帧) - 代码日志