Bir sütundaki kısmi dize eşleşmesine göre veri çerçevesi satırlarını seçme


101

Bir veri çerçevesinden satırları bir sütundaki bir dizenin kısmi eşleşmesine göre seçmek istiyorum, örneğin 'x' sütunu "hsa" dizesini içeriyor. Kullanarak sqldf- eğer bir likesözdizimi olsaydı - şöyle bir şey yapardım:

select * from <> where x like 'hsa'.

Maalesef sqldfbu sözdizimini desteklemiyor.

Veya benzer şekilde:

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

Hangi elbette çalışmıyor.

Biri bana yardım edebilir mi lütfen?


6
Verilerinizin birkaç satırını, tercihen gibi bir şey kullanarak gönderebilir misiniz dput(head(conservedData))?
A5C1D2H2I1M1N2O1R2T1

Yanıtlar:


155

%like%Mevcut yaklaşımınızda bir işlevden bahsettiğinizi fark ettim . Bunun %like%"data.table" dan bir referans olup olmadığını bilmiyorum ama eğer öyleyse, kesinlikle aşağıdaki gibi kullanabilirsiniz.

Nesnenin a olmak zorunda olmadığını data.tableunutmayın (ancak data.frames ve data.tables için alt küme yaklaşımlarının aynı olmadığını unutmayın):

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

Eğer sahip olduğunuz buysa, verileri alt küme oluşturmak için satır ve sütun konumlarını karıştırmış olabilirsiniz.


Bir paket yüklemek istemiyorsanız, grep()eşleştirdiğiniz dizeyi aramak için kullanmayı deneyebilirsiniz . Aşağıda mtcars, satır adlarının "Merc" kelimesini içerdiği tüm satırları eşleştirdiğimiz veri kümesine sahip bir örnek verilmiştir :

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

Ve irisdizeyi arayan veri kümesini kullanan başka bir örnek 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

Sorunuz için şunu deneyin:

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

+1: Ayrıca grepnormal ifadeleri desteklediğini unutmayın, bu yüzden ^hsa-bunun yerine grep isteyebilirsiniz .
nico

3
@nico: aslında, grepg / re / p (global / normal ifade / baskı) ed komutundan gelir ve gerçek gücünü yalnızca düzenli ifade ustasına gösterir-fu ;-): en.wikipedia.org/ wiki / Grep
Stephan Kolassa

1
% Gibi% öneri harika! Cevabınızın en üstüne koymanızı tavsiye ederim.
Aren Cambre

@ArenCambre, tamam. Belki de 11 oy daha
almamda

@ A5C1D2H2I1M1N2O1R2T1 Harika yanıt! Bir arada bulunan iki dizeyi aramak için% like% kullanmanın bir yolu var mı ("pet" ve "pip" bir veri çerçevesinin bir satırında "peter piper" olarak ortaya çıkan gibi)?
nigus21

63

Bir dizede bir desenin varlığını veya yokluğunu tespit str_detect()eden stringr paketini deneyin .

Burada da katıldığı bir yaklaşımdır %>%boru ve filter()gelen dplyr paketinin:

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
...

Bu, İşlem değişkeninin "non" alt dizesini içerdiği satırlar için örnek CO2 veri setini (R ile birlikte gelir) filtreler. str_detectSabit eşleşmeleri bulup bulmayacağını veya bir normal ifade kullanıp kullanmayacağını ayarlayabilirsiniz - stringr paketinin belgelerine bakın.


Trc_detect işlevini de şu şekilde kullanabilirsinizmyDataFrame[str_detect(myDataFrame$key, myKeyPattern),]
Bemipefe

21

LIKE sqlite cinsinden çalışmalı:

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 listelemek için en iyisidir. Ancak satırları silemez.
Suat Atan PhD

1
R paketi neden require()burada yükleniyor
rgalbo

Çünkü standart R kitaplığı değil ve manuel olarak kurmanız ve ardından requireişlevi kullanarak yüklemeniz gerekir .
bartektartanus

0

Başka bir seçenek de basitçe greplişlevi kullanmak olacaktır :

df[grepl('er', df$name), ]
CO2[grepl('non', CO2$Treatment), ]

df <- data.frame(name = c('bob','robert','peter'),
                 id = c(1,2,3)
                 )

# name id
# 2 robert  2
# 3  peter  3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.