2012-09-30 12 views
20

Ho una lista in R con i seguenti elementi:Come estrarre gli elementi da una lista con gli elementi misti

[[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" 

So che io possa accedere con qualcosa di simile list_elem[[814]][3] nel caso che voglio estrarre il terzo elemento della posizione 814. Ho bisogno di estrarre il terzo elemento di tutta la lista, ad esempio 12345_s_at, e voglio metterli in un vettore o in un elenco in modo da poter confrontare i loro elementi in un altro elenco in seguito. Qui di seguito è il mio codice:

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

Quando stampo i risultati che ottengo il terzo elemento, ma in questo modo:

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

quindi non posso li attraversare con un indice come newlist[3], perché restituisce NA. Dov'è il mio errore?

risposta

33

Se si desidera estrarre il terzo elemento di ciascun elemento della lista si può fare:

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 

Usando il tuo esempio e tenendo conto @GSee commento si può fare:

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" 

prossima volta puoi fornire alcuni dati utilizzando dput su una parte del set di dati in modo che possiamo riprodurre facilmente il tuo problema.

+7

Utilizzare 'sapply' per evitare la parte' unlist'. Inoltre, penso che '[' sarebbe sufficiente. +1 – GSee

0

Nel caso in cui si voleva utilizzare il codice digitato nella sua interrogazione, sotto è la correzione:

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" 
6

Con purrr è possibile estrarre gli elementi e garantire il tipo di dati di coerenza:

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" 

Ci sono altre funzioni map_ che applicano l'uniformità del tipo e un map_df() che può finalmente aiutare a terminare il follia do.call(rbind, …).

+0

dead simple. questa è la risposta moderna/ordinata a questo problema. – Andrew

Problemi correlati