web-dev-qa-db-fra.com

Comment extraire des éléments d'une liste avec des éléments mixtes

J'ai une liste en R avec les éléments suivants:

[[812]]
[1] ""             "668"          "12345_s_at" "667"          "4.899777748" 
[6] "49.53333333"  "10.10930207"  "1.598228663"  "5.087437057" 

[[813]]
[1] ""            "376"         "6789_at"  "375"         "4.899655078"
[6] "136.3333333" "27.82508792" "2.20223398"  "5.087437057"

[[814]]
[1] ""             "19265"        "12351_s_at" "19264"        "4.897730912" 
[6] "889.3666667"  "181.5874908"  "1.846451572"  "5.087437057" 

Je sais que je peux y accéder avec quelque chose comme list_elem[[814]][3] dans le cas où je souhaite extraire le troisième élément de la position 814. J'ai besoin d'extraire le troisième élément de toute la liste, par exemple 12345_s_at, et je veux les mettre dans un vecteur ou une liste afin de pouvoir comparer leurs éléments à une autre liste plus tard. Voici mon code:

elem<-(c(listdata))
lp<-length(elem)
for (i in 1:lp)
{
    newlist<-c(listdata[[i]][3]) ###maybe to put in a vector
    print(newlist)
 }

Lorsque j'imprime les résultats, j'obtiens le troisième élément, mais comme ceci:

  [1] "1417365_a_at"
  [1] "1416336_s_at"
  [1] "1416044_at"
  [1] "1451201_s_at"

donc je ne peux pas les parcourir avec un index comme newlist[3], car elle renvoie NA. Où est mon erreur?

24
Layla

Si vous souhaitez extraire le troisième élément de chaque élément de liste, vous pouvez le faire:

List <- list(c(1:3), c(4:6), c(7:9))
lapply(List, '[[', 3)  # This returns a list with only the third element
unlist(lapply(List, '[[', 3)) # This returns a vector with the third element

En utilisant votre exemple et en tenant compte du commentaire @GSee, vous pouvez faire:

yourList <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
       "10.10930207", "1.598228663","5.087437057"),
     c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
       "27.82508792", "2.20223398",  "5.087437057"),
     c("", "19265", "12351_s_at", "19264", "4.897730912",
       "889.3666667", "181.5874908","1.846451572","5.087437057" ))

sapply(yourList, '[[', 3)
[1] "12345_s_at" "6789_at"    "12351_s_at"

La prochaine fois, vous pourrez fournir des données à l'aide de dput sur une partie de votre ensemble de données afin que nous puissions reproduire votre problème facilement.

44
Jilber Urbina

Avec purrr, vous pouvez extraire des éléments et assurer la cohérence du type de données:

library(purrr)

listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
       "10.10930207", "1.598228663","5.087437057"),
     c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
       "27.82508792", "2.20223398",  "5.087437057"),
     c("", "19265", "12351_s_at", "19264", "4.897730912",
       "889.3666667", "181.5874908","1.846451572","5.087437057" ))

map_chr(listdata, 3)
## [1] "12345_s_at" "6789_at"    "12351_s_at"

Il existe d'autres fonctions map_ Qui renforcent également la cohérence du type et une fonction map_df() qui peut enfin aider à mettre fin à la folie do.call(rbind, …).

10
hrbrmstr

Si vous souhaitez utiliser le code que vous avez tapé dans votre question, voici le correctif:

listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333",
       "10.10930207", "1.598228663","5.087437057"),
     c("","376", "6789_at",  "375",  "4.899655078","136.3333333",
       "27.82508792", "2.20223398",  "5.087437057"),
     c("", "19265", "12351_s_at", "19264", "4.897730912",
       "889.3666667", "181.5874908","1.846451572","5.087437057" ))

v <- character() #creates empty character vector
list_len <- length(listdata)
for(i in 1:list_len)
    v <- c(v, listdata[[i]][3]) #fills the vector with list elements (not efficient, but works fine)

print(v)
[1] "12345_s_at" "6789_at"    "12351_s_at"
1
Marco Demaio