J'ai la liste de liste suivante. Il contient deux variables: la paire et les gènes. Le contenu de pair
est toujours un vecteur avec deux chaînes. Et la variable genes
est un vecteur qui peut contenir plus de 1 valeurs.
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"
Comment puis-je le convertir dans ce dataframe:
pair1 pair2 genes_vec
BoneMarrow Pulmonary PRR11
BoneMarrow Umbilical GNB2L1
Pulmonary Umbilical ATP1B1
Notez que la variable genes
est un vecteur et non une chaîne unique.
Mon meilleur essai est celui qui ne donne pas ce que je veux:
> 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
Mettre à jour :
Avec nouvel exemple pour afficher le contenu vectoriel de 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"
Le résultat attendu est:
pair1 pair2 genes_vec
BoneMarrow Pulmonary PRR11,GNB2L1
BoneMarrow Umbilical GNB2L1
Pulmonary Umbilical ATP1B1
En utilisant tidyverse
, vous pouvez utiliser purrr
pour vous aider
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
dans le deuxième exemple, il suffit de remplacer map_chr(lol, "genes")
par map(lol2, "genes")
pour conserver un cadre de données imbriqué avec une colonne de liste.
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]>
Et une approche plus générique consisterait à travailler avec des mots imbriqués et à les désenvoyer au besoin.
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]>
Pour lol2
rien ne change sauf si la liste lol2
au lieu de 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]>
Vous pouvez alors annuler ce que vous voulez dans la colonne
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
EDIT: mis à jour pour fonctionner avec le vecteur lol2.
Peut-être comme ça:
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
> 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
Cela devrait fonctionner:
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
La même façon de traiter les gènes en tant que vecteur est identique à celle utilisée pour traiter les paires en tant que vecteur. Au lieu des paires 1 et 2, vous utilisez simplement les deux.