2012-09-30 106 views
20

我在R中的以下元素的列表:如何提取從列表中的元素混合元素

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

我知道我可以的情況下,用類似list_elem[[814]][3]訪問他們,我想提取第三我需要提取所有列表的第三個元素,例如12345_s_at,並且我想將它們放入向量或列表中,以便稍後將它們的元素與另一個列表進行比較。下面是我的代碼:

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

當我打印結果我得到的第三個元素,但這樣的:

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

,所以我不能用索引遍歷他們像newlist[3],因爲它返回NA。我的錯誤在哪裏?

回答

33

如果你想提取每個列表元素的第三個元素,你可以這樣做:

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 

使用你的榜樣,並考慮到@GSee評論,你可以這樣做:

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" 

下一次您可以在數據集的一部分上使用dput提供一些數據,以便我們輕鬆地重現您的問題。

+7

使用'sapply'來避免'unlist'部分。另外,我認爲'['就足夠了。 +1 – GSee

0

如果你想用你在你的問題中鍵入的代碼,下面是修復:

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

隨着purrr可以提取元素,並確保數據類型的一致性:

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" 

有其他的map_函數也強制執行類型一致性,以及最終可以幫助結束do.call(rbind, …)瘋狂的map_df()

+0

死簡單。這是對這個問題的現代/整潔的答案。 – Andrew