2012-03-24 11 views
10

सबसेट पंक्तियों/किसी भी स्तंभ एक विशिष्ट मूल्य

df <- data.frame(id=c(1:5), v1=c(0,15,9,12,7), v2=c(9,32,6,17,11)) 

के साथ मैं कैसे सभी कॉलम 10 की तुलना में बड़ा पर मूल्यों के साथ पंक्तियों निकाल सकते हैं, जो लौट जाना से भी बड़ा:

id v1 v2 
2 2 15 32 
4 4 12 17 

और क्या

id v1 v2 
2 2 15 32 
4 4 12 17 
5 5 7 11 

उत्तर

16

कार्यों देखें all() और क्रमश: आपके प्रश्नों के पहले और दूसरे भागों के लिए any() है निकालने के लिए। पंक्तियों या स्तंभों पर कार्यों को चलाने के लिए apply() फ़ंक्शन का उपयोग किया जा सकता है। (MARGIN = 1 पंक्तियां हैं, MARGIN = 2 स्तंभ हैं, आदि)। नोट मैं df[, -1] पर apply() का उपयोग करते हैं की तुलना करते समय id चर अनदेखी करने के लिए।

भाग 1:

> df <- data.frame(id=c(1:5), v1=c(0,15,9,12,7), v2=c(9,32,6,17,11)) 
> df[apply(df[, -1], MARGIN = 1, function(x) all(x > 10)), ] 
    id v1 v2 
2 2 15 32 
4 4 12 17 

भाग 2:

> df[apply(df[, -1], MARGIN = 1, function(x) any(x > 10)), ] 
    id v1 v2 
2 2 15 32 
4 4 12 17 
5 5 7 11 

देखने के लिए क्या चल रहा है, x > 10 का संकेत प्रत्येक तत्व अधिक से अधिक 10 से है कि क्या प्रत्येक पंक्ति के लिए एक तार्किक वेक्टर (apply() के माध्यम से रिटर्न । all() रिटर्न TRUEयदि इनपुट वेक्टर के सभी तत्व TRUE और FALSE अन्यथा कर रहे हैं। +०१२३१८३७३२४रिटर्न TRUE अगर इनपुट में से कोई भी तत्वTRUE और FALSE है अगर सब FALSE हैं।

मैं तो apply() कॉल

> apply(df[, -1], MARGIN = 1, function(x) all(x > 10)) 
[1] FALSE TRUE FALSE TRUE FALSE 
> apply(df[, -1], MARGIN = 1, function(x) any(x > 10)) 
[1] FALSE TRUE FALSE TRUE TRUE 

से उत्पन्न तार्किक वेक्टर का उपयोग (जैसा कि ऊपर दिखाया गया है) df सबसेट तक।

5

यह किया जा सकता है मार्जिन 1 के साथ apply का उपयोग कर, जो एक लागू होंगे: किसी भी स्तंभ 10 से बड़ा पर अगर प्रत्येक पंक्ति के लिए समारोह। समारोह की जांच करने के लिए एक भी पंक्ति

function(row) {all(row > 10)} 

तो तरीका होगा पंक्तियों खुद को

df[apply(df, 1, function(row) {all(row > 10)}),] 
+0

+1 - और दूसरे प्रश्न के लिए 'किसी भी' के साथ 'all' को प्रतिस्थापित करें। – flodel

+2

प्रतीक्षा करें, आप 'आईडी' कॉलम के लिए 'सभी (पंक्ति [-1]> 10) नहीं करना चाहते हैं। या 'डीएफ [-1] 'पर फ़ंक्शन लागू करें। – flodel

0

एक विकल्प (apply साथ उदा) पंक्ति-दर-पंक्ति पाशन जाता है और any या all का उपयोग कर, के रूप में अन्य दो जवाब में प्रस्ताव रखा। हालांकि, यह बड़े डेटा फ्रेम के लिए अक्षम हो सकता है।

एक वेक्टरकृत दृष्टिकोण rowSums का उपयोग करने के लिए आपके मानदंड से मेल खाने वाली प्रत्येक पंक्ति में मानों की संख्या निर्धारित करने के लिए और उस पर आधारित फ़िल्टर का उपयोग करना होगा।

पंक्तियों जहां सब कुछ कम से कम 10 है करने के लिए छानने हैं, तो यह उन मामलों में जहां मूल्यों में 10 से अधिक नहीं की संख्या 0 है छानने रूप में ही है:

df[rowSums(df[,-1] <= 10) == 0,] 
# id v1 v2 
# 2 2 15 32 
# 4 4 12 17 

इसी तरह, rowSums आसानी से किया जा सकता है कुछ भी से अधिक 10 के साथ पंक्तियों की गणना:

set.seed(144) 
df <- matrix(sample(c(1, 10, 20), 3e6, replace=TRUE), ncol=3) 
system.time(df[apply(df[, -1], MARGIN = 1, function(x) all(x > 10)), ]) 
# user system elapsed 
# 1.754 0.156 2.102 
system.time(df[rowSums(df[,-1] <= 10) == 0,]) 
# user system elapsed 
# 0.04 0.01 0.05 
:

df[rowSums(df[,-1] > 10) > 0,] 
# id v1 v2 
# 2 2 15 32 
# 4 4 12 17 
# 5 5 7 11 

speedup एक बड़ा इनपुट के साथ स्पष्ट है 10

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