[英]How to convert list of list into a tibble (dataframe)
我有以下清單。 它包含兩個變量:pair 和基因。 所述包含的pair
是總是與兩個字符串矢量。 變量genes
是一個向量,可以包含 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
請注意, genes
變量是一個向量而不是單個字符串。
我最好的嘗試是這並沒有給出我想要的:
> 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
更新:
用新的例子來顯示genes
載體內容
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")
因為您想保留帶有列表列的嵌套數據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
編輯:更新以使用矢量 lol2。
也許是這樣的:
as.data.frame(do.call(rbind,lapply(lol2, function(x) {c(unlist(x[1]),gene=paste(unlist(x[2]),collapse=","))})),stringsAsFactors = F)
pair1 pair2 genes
1 BoneMarrow Pulmonary GNB2L1, PRR11
2 BoneMarrow Umbilical GNB2L1
3 Pulmonary Umbilical ATP1B1
對於第一個問題,與其他答案幾乎相同,略短/更緊湊:
library(tidyverse)
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")))
map_dfr(lol, ~as_tibble(.) %>%
mutate(row=paste0("pair", row_number()))%>%
spread(row, pair) %>%
select(pair1, pair2, genes))
#> # A tibble: 3 x 3
#> pair1 pair2 genes
#> <chr> <chr> <chr>
#> 1 BoneMarrow Pulmonary PRR11
#> 2 BoneMarrow Umbilical GNB2L1
#> 3 Pulmonary Umbilical ATP1B1
由reprex 包(v0.3.0) 於 2020 年 12 月 4 日創建
> lol1 <- data.frame(t(sapply(lol,c)))
> as.data.frame(t(apply(lol1, 1, unlist)))
pair1 pair2 genes
1 BoneMarrow Pulmonary PRR11
2 BoneMarrow Umbilical GNB2L1
3 Pulmonary Umbilical ATP1B1
這應該有效:
data.frame(do.call(rbind,lol2))
data.frame(do.call(rbind,lol2))
pair genes
1 BoneMarrow, Pulmonary GNB2L1, PRR11
2 BoneMarrow, Umbilical GNB2L1
3 Pulmonary, Umbilical ATP1B1
將基因視為向量的方式與將基因對視為向量的方式相同。您只需使用它們,而不是對 1 和 2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.