किसी स्तंभ में आंशिक स्ट्रिंग मिलान के आधार पर डेटा फ़्रेम पंक्तियों का चयन करना


97

मैं स्तंभ में स्ट्रिंग के आंशिक मिलान के आधार पर डेटा फ्रेम से पंक्तियों का चयन करना चाहता हूं, उदाहरण के लिए स्तंभ 'x' में स्ट्रिंग "hsa" है। का उपयोग करना sqldf- अगर इसमें एक likeवाक्यविन्यास था - मैं कुछ ऐसा करूंगा:

select * from <> where x like 'hsa'

दुर्भाग्य से, sqldfउस वाक्य रचना का समर्थन नहीं करता है।

या इसी तरह:

selectedRows <- df[ , df$x %like% "hsa-"]

कौन सा काम नहीं करता है

क्या कोई कृपया इसमें मेरी मदद कर सकता है?


6
क्या आप अपने डेटा की कुछ पंक्तियाँ पोस्ट कर सकते हैं, अधिमानतः कुछ का उपयोग करके dput(head(conservedData))
A5C1D2H2I1M1N2O1R2T1

जवाबों:


149

मुझे लगता है कि आप %like%अपने वर्तमान दृष्टिकोण में एक समारोह का उल्लेख करते हैं। मुझे नहीं पता कि यह %like%"data.table" से एक संदर्भ है , लेकिन अगर यह है, तो आप निश्चित रूप से निम्नानुसार उपयोग कर सकते हैं।

ध्यान दें कि ऑब्जेक्ट का होना आवश्यक नहीं है data.table(लेकिन यह भी याद रखें कि data.frames और data.tables के लिए सबसेट दृष्टिकोण समान नहीं हैं):

library(data.table)
mtcars[rownames(mtcars) %like% "Merc", ]
iris[iris$Species %like% "osa", ]

यदि आपके पास यही था, तो शायद आपने डेटा को कम करने के लिए पंक्ति और स्तंभ पदों को मिलाया था।


यदि आप पैकेज लोड नहीं करना चाहते हैं, तो आप अपने द्वारा grep()मिलान किए जा रहे स्ट्रिंग की खोज करने के लिए उपयोग कर सकते हैं। यहां mtcarsडेटासेट के साथ एक उदाहरण दिया गया है , जहां हम उन सभी पंक्तियों का मिलान कर रहे हैं जहां पंक्ति नामों में "Merc" शामिल हैं:

mtcars[grep("Merc", rownames(mtcars)), ]
             mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 240D   24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
# Merc 230    22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
# Merc 280    19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
# Merc 280C   17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
# Merc 450SE  16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
# Merc 450SL  17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
# Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3

और, irisस्ट्रिंग के लिए खोज करने वाले डेटासेट का उपयोग करके एक और उदाहरण osa:

irisSubset <- iris[grep("osa", iris$Species), ]
head(irisSubset)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

अपनी समस्या के लिए प्रयास करें:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]

+1: यह भी ध्यान दें कि grepआप नियमित अभिव्यक्तियों का समर्थन करते हैं ताकि आप ^hsa-इसके बजाय संक्षिप्त करना चाहें ।
निको

3
@ एनिको: वास्तव में, grepएड कमांड g / re / p (ग्लोबल / रेगुलर एक्सप्रेशन / प्रिंट) से आता है, और यह नियमित एक्सप्रेशन-फू के मास्टर को ही इसकी वास्तविक शक्ति का पता चलता है ;-): en.wikipedia.org/ विकी / ग्रेप
स्टीफन कोलासा

1
% वख% वबवध बड! मैं इसे आपके उत्तर के शीर्ष पर रखने की सलाह देता हूं।
एरेन कैम्ब्रिज

@ArenCambre, किया। शायद यह मुझे एक और 11 वोट प्राप्त करने में मदद करेगा ताकि मुझे वर्ष के अंत से पहले एक नई टोपी मिल सके :-)
A5C1D2H2I1M1N2O1R2T1

@ A5C1D2H2I1M1N2O1R2T1 बढ़िया जवाब! क्या दो स्ट्रिंग्स को खोजने के लिए% की तरह% का उपयोग करने का एक तरीका है (जैसे कि "pet" और "pip" एक डेटाफ्रेम की एक पंक्ति में "peter piper" के रूप में प्रस्तुत करते हैं)?
nigus21 21

62

स्ट्रिंग पैकेज str_detect()से कोशिश करें , जो एक स्ट्रिंग में पैटर्न की उपस्थिति या अनुपस्थिति का पता लगाता है।

यहाँ और इस तरीके को शामिल किया गया है %>%पाइप और filter()से dplyr पैकेज:

library(stringr)
library(dplyr)

CO2 %>%
  filter(str_detect(Treatment, "non"))

   Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
2    Qn1      Quebec nonchilled  175   30.4
3    Qn1      Quebec nonchilled  250   34.8
4    Qn1      Quebec nonchilled  350   37.2
5    Qn1      Quebec nonchilled  500   35.3
...

यह उन पंक्तियों के लिए नमूना CO2 डेटा सेट (जो R के साथ आता है) को फ़िल्टर करता है जहां उपचार चर में "नॉन" विकल्प होता है। आप समायोजित कर सकते हैं कि क्या str_detectनिश्चित मैच मिलते हैं या एक रेगेक्स का उपयोग करते हैं - स्ट्रिंग पैकेज के लिए प्रलेखन देखें।


आप इस तरह से trc_detect फ़ंक्शन का उपयोग कर सकते हैंmyDataFrame[str_detect(myDataFrame$key, myKeyPattern),]
Bemipefe

20

LIKE sqlite में काम करना चाहिए:

require(sqldf)
df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3))
sqldf("select * from df where name LIKE '%er%'")
    name id
1 robert  2
2  peter  3

SQLDF लिस्टिंग के लिए सबसे अच्छा है। हालाँकि, यह पंक्तियों को हटा नहीं सकता।
सुत अतन पीएचडी

1
आर पैकेज को require()यहाँ से क्यों भरा जा रहा है
rglbo

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