किसी स्थिति को पूरा करने वाले मैट्रिक्स की पंक्तियों का चयन करें


144

मैट्रिक्स के साथ R में:

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

मैं सबमेट्रिक्स को निकालना चाहता हूं जिसकी पंक्तियों में कॉलम तीन = 11 है। यह है:

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

मैं बिना लूपिंग के ऐसा करना चाहता हूं। मैं आर के लिए नया हूँ इसलिए यह शायद बहुत स्पष्ट है लेकिन प्रलेखन अक्सर कुछ हद तक कठिन है।


4
हर उत्तर में मूल विचार यह है कि यदि आपके पास कुछ सूचकांक के समान लंबाई के तार्किक वेक्टर / मैट्रिक्स (TRUE और FALSEs) हैं, तो आप केवल उन मामलों का चयन करेंगे जो TRUE हैं। [ ]उत्तरों के बीच कोड चलाएँ और आप इसे और अधिक स्पष्ट रूप से देखेंगे।
सच्चा ईप्सकैंप

जवाबों:


160

यदि आप अपने मैट्रिक्स को as.data.frame () का उपयोग करके डेटा फ़्रेम में परिवर्तित करना आसान है। उस स्थिति में पिछले उत्तर (सबसेट या मी $ तीन का उपयोग करके) काम करेंगे, अन्यथा वे नहीं करेंगे।

मैट्रिक्स पर ऑपरेशन करने के लिए , आप एक कॉलम को नाम से परिभाषित कर सकते हैं:

m[m[, "three"] == 11,]

या संख्या से:

m[m[,3] == 11,]

ध्यान दें कि यदि केवल एक पंक्ति मेल खाती है, तो परिणाम एक पूर्णांक वेक्टर है, मैट्रिक्स नहीं।


19
यदि आपको मैट्रिक्स रखने की आवश्यकता है, तो करेंm[m[,3] == 11,,drop=FALSE]
जोरिस मेय्स

@neilfws यदि मैं स्तंभों की श्रेणी के लिए कुछ मानों को परिभाषित करना चाहता हूं तो समाधान क्या होगा। उदाहरण के लिए df <- df[!which(df$ARID3A:df$YY1 == "U"),], यहाँ मैं उन पंक्तियों को अपने df से हटाना चाहता हूँ जहाँ स्तंभों की एक श्रेणी (ARID3A: YY1) में मान U होता है
नौसिखिया

यदि आप कॉलम के नामों को बिल्कुल भी निर्दिष्ट नहीं करना चाहते हैं, लेकिन मैट्रिक्स में सभी कॉलमों पर काम करना चाहते हैं तो यह कैसे काम करता है?
user5359531

अरे @neilfws, आप इसमें && स्टेटमेंट कैसे जोड़ सकते हैं? मुझे एक ही समय में दो कॉलम मान प्राप्त करने की आवश्यकता है?
XD

28
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

निम्नलिखित कमांड ऊपर दी गई मैट्रिक्स की पहली पंक्ति का चयन करेगी।

subset(m, m[,4] == 16)

और यह अंतिम तीन का चयन करेगा।

subset(m, m[,4] > 17)

परिणाम दोनों मामलों में एक मैट्रिक्स होगा। यदि आप स्तंभों का चयन करने के लिए स्तंभ नामों का उपयोग करना चाहते हैं, तो आप इसे डेटाफ़्रेम के साथ परिवर्तित करना सबसे अच्छा होगा

mf <- data.frame(m)

फिर आप के साथ चयन कर सकते हैं

mf[ mf$a == 16, ]

या, आप सबसेट कमांड का उपयोग कर सकते हैं।


21

मैं dplyr पैकेज का उपयोग करके एक सरल दृष्टिकोण चुनूंगा।

यदि डेटाफ्रेम डेटा है।

library(dplyr)
result <- filter(data, three == 11)

11

सबसेट एक बहुत धीमा कार्य है, और मैं व्यक्तिगत रूप से इसे बेकार मानता हूं।

मैं तुम्हें एक data.frame, सरणी, मैट्रिक्स कहा जाता है मान Matके साथ A, B, Cस्तंभ नाम के रूप में; फिर आपको बस इतना करना है:

  • एक स्तंभ पर एक स्थिति के मामले में, स्तंभ A कह सकते हैं

    Mat[which(Mat[,'A'] == 10), ]

विभिन्न स्तंभों पर कई स्थितियों के मामले में, आप एक डमी चर बना सकते हैं। मान लीजिए कि स्थितियां हैं A = 10, B = 5और C > 2, फिर हमारे पास हैं:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

के साथ गति लाभ का परीक्षण करके system.time, whichविधि की तुलना में subsetविधि 10x तेज है ।


6

यदि आपका मैट्रिक्स कहा जाता है m, तो बस उपयोग करें:

R> m[m$three == 11, ]

@ जुबा यदि स्तंभों की श्रेणी के लिए कुछ मानों को परिभाषित करना चाहता है तो क्या समाधान होगा। उदाहरण के लिए df <- df[!which(df$ARID3A:df$YY1 == "U"),], यहाँ मैं उन पंक्तियों को अपने df से हटाना चाहता हूँ जहाँ कॉलम की एक श्रेणी (ARID3A: YY1) में मान शामिल हैU
Newbie

0

यदि डेटासेट को डेटा कहा जाता है, तो सभी पंक्तियाँ एक शर्त को पूरा करती हैं, जहाँ कॉलम 'pm2.5'> 300 का मान प्राप्त किया जा सकता है -

डेटा [डेटा ['pm2.5']> 300,]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.