2012-09-30 17 views
20

मैं निम्नलिखित तत्वों के साथ आर में एक सूची है के साथ एक सूची से तत्वों को निकालने के लिए:कैसे मिश्रित तत्वों

[[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] की तरह कुछ के साथ उन तक पहुँच सकते पता है कि मैं तीसरे निकालना चाहते हैं स्थिति 814. मुझे सभी सूची के तीसरे तत्व को निकालने की आवश्यकता है, उदाहरण के लिए 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' का उपयोग करें। इसके अलावा, मुझे लगता है कि '[' पर्याप्त होगा। +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_ फ़ंक्शन हैं जो प्रकार स्थिरता को लागू करते हैं और map_df() जो अंततः do.call(rbind, …) पागलपन को समाप्त करने में सहायता कर सकते हैं।

+0

मृत सरल। यह इस समस्या का आधुनिक/साफ जवाब है। – Andrew

संबंधित मुद्दे