एक तार्किक स्थिति द्वारा डेटा.फ्रेम पंक्तियों को फ़िल्टर करें


155

मैं data.frameतार्किक स्थिति के आधार पर पंक्तियों को फ़िल्टर करना चाहता हूं । मान लीजिए कि मेरे पास डेटा फ्रेम है जैसे

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc
7    6.791656          hips
8    7.133673          hips
9    7.574058          hips
10   7.208041          hips
11   7.402100          hips
12   7.167792          hips
13   7.156971          hips
14   7.197543          hips
15   7.035404          hips
16   7.269474          hips
17   6.715059          hips
18   7.434339          hips
19   6.997586          hips
20   7.619770          hips
21   7.490749          hips

मैं जो चाहता हूं वह एक नया डेटा फ्रेम प्राप्त करना है जो समान दिखता है लेकिन केवल एक सेल_टाइप के लिए डेटा है। उदाहरण के लिए उप-पंक्तियाँ / पंक्तियों का चयन करें जिसमें सेल प्रकार "hesc" है:

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

या तो सेल प्रकार "बीजे फ़ाइब्रोब्लास्ट" या "हिचकिया":

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc

क्या ऐसा करने का कोई आसान तरीका है?

मैंने कोशिश की:

expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc"     "hesc"     "hesc"    

यदि मूल डेटा फ़्रेम को "expr" कहा जाता है, लेकिन यह गलत प्रारूप में परिणाम देता है जैसा कि आप देख सकते हैं।

जवाबों:


210

एक 'cell_type' (उदाहरण के लिए 'hesc') के अनुसार पंक्तियों का चयन करने के लिए , उपयोग करें ==:

expr[expr$cell_type == "hesc", ]

दो या दो से अधिक भिन्न 'सेल_टाइप' के अनुसार पंक्तियों का चयन करने के लिए, (उदाहरण के लिए या तो 'हिचकियां' या 'बीजे फ़ाइब्रोब्लास्ट'), का उपयोग करें %in%:

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]

28
ध्यान रखें कि ==फ़ंक्शन किसी भी NA रिकॉर्ड के साथ-साथ "हिचकिचाहट" उठाएगा, जबकि %in%नहीं होगा।
मैट पार्कर

मुझे आश्चर्य है कि अगर यह अब काम करता है? मैं इस तरह से शर्त के आधार पर डेटाफ्रेम को कम करने में सक्षम नहीं था।
सुमंत लाजर

85

उपयोग subset(इंटरैक्टिव उपयोग के लिए)

subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))

या और अच्छा dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))

37
सावधान! के प्रलेखन subsetएक बड़ी चेतावनी है: "यह एक सुविधा समारोह उपयोग सहभागी लिए करना है प्रोग्रामिंग के लिए ये ऐसा [मानक subsetting कार्यों का उपयोग करने के लिए बेहतर है, और विशेष रूप से तर्क के गैर standar डी मूल्यांकन। सबसेट अप्रत्याशित consequen सीईएस हो सकता है । "
अलेक्जेंडर दिमित्रोव

33

कारण expr[expr[2] == 'hesc']यह नहीं है कि डेटा फ्रेम के लिए, x[y]पंक्तियों का चयन करता है, न कि पंक्तियों का। यदि आप पंक्तियों का चयन करना चाहते हैं, तो सिंटैक्स में बदलें x[y,]:

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc

यह कोई भी NAरिकॉर्ड उठाएगा! इसलिए, लागू नहीं है। यह सच लगने का कारण यह है कि एक्सपर्ट डेटाफ्रेम NAके फ़िल्टर किए गए कॉलम में कोई भी नहीं है। अगर वहाँ है NA, तो आपका तरीका लागू नहीं है जैसा मैंने पहले कहा था।
एर्दोगन CEVHER

26

आप dplyrपैकेज का उपयोग कर सकते हैं :

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")

5

लगता है कि किस फंक्शन को शामिल नहीं किया गया है। यह छानने के लिए भी उपयोगी साबित हो सकता है।

expr[which(expr$cell == 'hesc'),]

यह NAs को भी संभालेगा और परिणामी डेटाफ्रेम से उन्हें छोड़ देगा।

इसे 2440 डेटाफ्रेम 50000 बार 9840 पर चलाने पर, ऐसा लगता है कि किस पद्धति में% पद्धति की तुलना में 60% तेज रन समय है।


4

मैं एक डेटाफ्रेम पर काम कर रहा था और प्रदान किए गए उत्तरों के साथ कोई भाग्य नहीं था, यह हमेशा 0 पंक्तियों को लौटाता था, इसलिए मैंने पाया और grepl का उपयोग किया:

df = df[grepl("downlink",df$Transmit.direction),]

जो मूल रूप से मेरे डेटाफ्रेम को केवल उन पंक्तियों के लिए ट्रिम कर देता है जिनमें "डाउनलिंक" होता है जो कि ट्रांसमिट दिशा कॉलम में होता है। पुनश्च अगर कोई अनुमान लगा सकता है कि मैं अपेक्षित व्यवहार क्यों नहीं देख रहा हूं, तो कृपया एक टिप्पणी छोड़ दें।

मूल प्रश्न के लिए विशेष रूप से:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

3

कभी-कभी जिस कॉलम को आप फ़िल्टर करना चाहते हैं वह कॉलम इंडेक्स 2 की तुलना में एक अलग स्थिति में दिखाई दे सकता है या एक चर नाम हो सकता है।

इस स्थिति में, आप केवल उस कॉलम नाम का उल्लेख कर सकते हैं जिसे आप फ़िल्टर करना चाहते हैं:

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]

यह कोई भी NAरिकॉर्ड उठाएगा! इसलिए, लागू नहीं है।
एरडोगन CEVHER

0

हम data.table लाइब्रेरी का उपयोग कर सकते हैं

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

या %like%पैटर्न मिलान के लिए ऑपरेटर का उपयोग करके फ़िल्टर करें

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

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