2013-01-17 10 views
18

मैं एक नौसिखिया आर को मैं आर में एक सूची t1 है जो दिखता हैतत्वों को निकालने के लिए कैसे

तरह
[[1]] 
[[1]][[1]] 
[1] "a"  "control" 


[[2]] 
[[2]][[1]] 
[1] "a"  "disease1" 


[[3]] 
[[3]][[1]] 
[1] "a"  "disease2" 


[[4]] 
[[4]][[1]] 
[1] "b"  "control" 


[[5]] 
[[5]][[1]] 
[1] "b"  "disease1" 


[[6]] 
[[6]][[1]] 
[1] "b"  "disease2" 

मैं एक वेक्टर यानी में पहली तत्वों की एक अद्वितीय सूची प्राप्त करने की आवश्यकता कर रहा हूँ [ इस वेक्टर t1 से "ए", "बी"]। मैं यह कैसे कर सकता हूँ?

+2

कृपया एक पुन: उत्पन्न उदाहरण प्रदान करें, उदा। 'dput' का उपयोग कर। –

उत्तर

16

rapply अभी तक एक और विकल्प प्रदान करता है:

उदाहरण के लिए

unique(rapply(t1, function(x) head(x, 1))) 
+0

प्यारा और संक्षिप्त। मुझें यह पसंद है। –

+0

धन्यवाद मैट, वास्तव में बहुत संक्षिप्त! – rlpatrao

+1

एफडब्ल्यूआईडब्ल्यू, आप पहले के बजाए प्रत्येक अंतिम तत्व प्राप्त करने के लिए 'head()' के बजाय 'पूंछ()' का उपयोग कर सकते हैं। – user1092247

13

मैं do.call और rbind का उपयोग data.frame में सूची को समेकित करने के लिए करता हूं। unlist उपयोग करने के लिए

spam = do.call("rbind", lapply(t1, "[[", 1)) 
> spam 
    [,1] [,2]  
[1,] "a" "control"               
[2,] "b" "disease1" 
> unique(spam[,1]) 
[1] "a" "b" 
+0

यह अच्छा है, मैंने कुछ समय पहले * लागू कार्यों का उपयोग शुरू किया था और मैं उन्हें अनदेखा करता रहता हूं। –

+0

लागू फ़ंक्शन वास्तव में सरणी प्रकार या सूची डेटा के साथ काम करते हैं, और कुछ ऐसे लोग हैं जो आर का उपयोग शुरू करने के लिए उपयोग करने में असहज पाते हैं। मैं वास्तव में उन्हें अपने शस्त्रागार में जोड़ने की कोशिश करने की सिफारिश करता हूं, यह बहुत ही कुशल और लघु समाधान प्रदान कर सकता है। –

+0

धन्यवाद, यह एक अच्छा जवाब है। अनलिस्ट का उपयोग करने के लिए –

16

एक और तरीका है: तो फिर तुम अद्वितीय आइटम प्राप्त करने के लिए (उदाहरण के @AR द्वारा दिए गए का उपयोग) प्रथम स्तंभ पर unique उपयोग कर सकते हैं

> t1=list(list(c("a","control")),list(c("b","disease1"))) 
> t1 
[[1]] 
[[1]][[1]] 
[1] "a"  "control" 


[[2]] 
[[2]][[1]] 
[1] "b"  "disease1" 

> matrix(unlist(t1),ncol=2,byrow=TRUE) 
    [,1] [,2]  
[1,] "a" "control" 
[2,] "b" "disease1" 
+0

+1, मुझे लगता है कि यह मेरे समाधान की तुलना में बहु-स्तरीय सूची के सटीक आकार पर कम निर्भर करता है। –

+0

हां इसमें यह सीमाएं हैं :) @llpatrao द्वारा दिया गया उदाहरण इसके बारे में कुछ भी नहीं कहता है, लेकिन आप सही हैं। –

+0

बहुत धन्यवाद दोस्तों, वास्तव में यह मेरे लिए अच्छा काम करता है। मेरे पास बराबर संख्या में कॉलम हैं। मुझे @ मैथ्यू प्लॉर्डे का जवाब भी पसंद है, इसकी सराहना के लिए! – rlpatrao

4

मैं इलाज के लिए करने की कोशिश की सामान्य मामला जब एक या अधिक उपन्यासकारों में एक से अधिक तत्व होते हैं।

ll <- 
     list(list(c("a","control")), 
      list(c("b","disease1")), 
      list(c("c","disease2"),c("c","disease2bis")), # 2 elements 
      list(c("d","disease3")), 
      list(c("e","disease4")) 
) 

आप कुछ इस तरह कर सकते हैं::

unlist(lapply(ll,         ## for each element in the big list 
     function(x) 
      sapply(1:length(x),     ## for each element in the sublist 
      function(y)do.call("[[",list(x,y))))) ## retrieve x[[y]] 


[1] "a"   "control"  "b"   "disease1" "c"   
    "disease2" "c"   "disease2bis" "d"   "disease3" 
[11] "e"   "disease4" 
1

उपयोग पैकेज rlist, अर्थात

library(rlist) 
yourlist %>>% list.map(.[1])