2011-08-04 16 views
22

पर आधारित सूची में सब्सक्राइब तत्व मैं किसी अन्य सूची में किसी शर्त (TRUE, FALSE) के आधार पर किसी सूची को कैसे सब्सक्राइब कर सकता हूं? एल [cond] मेंतार्किक स्थिति

l <- list(a=c(1,2,3), b=c(4,5,6,5), c=c(3,4,5,6)) 
l 
$a 
[1] 1 2 3 

$b 
[1] 4 5 6 5 

$c 
[1] 3 4 5 6 

cond <- lapply(l, function(x) length(x) > 3) 
cond 
$a 
[1] FALSE 

$b 
[1] TRUE 

$c 
[1] TRUE 

> l[cond] 

त्रुटि:: कृपया, नीचे मेरी उदाहरण देख अवैध सबस्क्रिप्ट प्रकार 'सूची'

उत्तर

11

[ एक सदिश की उम्मीद कर रहा है, इसलिए का उपयोग unlistcond पर:

l[unlist(cond)] 
$b 
[1] 4 5 6 5 

$c 
[1] 3 4 5 6 
3
> l[as.logical(cond)] 
$b 
[1] 4 5 6 5 

$c 
[1] 3 4 5 6 
20

इसके बजाय sapply का उपयोग करना एक और तरीका है lapply का।

cond <- sapply(l, function(x) length(x) > 3) 
l[cond] 
+0

यह केवल ऑब्जेक्ट कंड, सबसेट का परिणाम उत्पन्न करता है। – jrara

+0

स्पष्टीकरण के लिए, एल [cond] अब सबसेट उत्पन्न करता है क्योंकि एक सदिश को एक वेक्टर देता है। इसे जोड़ने के लिए संपादित किया गया। – PatrickR

17

यह वही है Filter समारोह के लिए बनाया गया था:

Filter(function(x) length(x) > 3, l) 
$b 
[1] 4 5 6 5 

$c 
[1] 3 4 5 6 
+0

सरल। बेस आर। इसे प्यार करो! – CephBirk

0
cond <- lapply(l, length) > 3 
l[cond] 
0

मैं हाल ही में lengths() है, जो एक सूची के प्रत्येक तत्व की लंबाई हो जाता है सीखा है। यह हमें ओपी की कोशिश के रूप में तार्किक मूल्यों सहित एक और सूची बनाने से बचने की अनुमति देता है।

lengths(l) 
#a b c 
#3 4 4 

एक तार्किक हालत में इस का उपयोग करना, हम l में सूची तत्वों सबसेट कर सकते हैं।

l[lengths(l) > 3] 

$b 
[1] 4 5 6 5 

$c 
[1] 3 4 5 6 
संबंधित मुद्दे