Memilih baris bingkai data berdasarkan kecocokan string parsial dalam kolom

97

Saya ingin memilih baris dari bingkai data berdasarkan kecocokan sebagian dari string dalam kolom, misalnya kolom 'x' berisi string "hsa". Menggunakan sqldf- jika itu memiliki likesintaks - Saya akan melakukan sesuatu seperti:

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

Sayangnya, sqldftidak mendukung sintaks itu.

Atau serupa:

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

Yang tentu saja tidak berhasil.

Adakah yang bisa membantu saya dengan ini?

Asda
sumber
6
Dapatkah Anda memposting beberapa baris data Anda, lebih disukai menggunakan sesuatu seperti dput(head(conservedData)).
A5C1D2H2I1M1N2O1R2T1

Jawaban:

149

Saya perhatikan bahwa Anda menyebutkan suatu fungsi %like%dalam pendekatan Anda saat ini. Saya tidak tahu apakah itu referensi ke %like%dari "data.table", tetapi jika ya, Anda pasti dapat menggunakannya sebagai berikut.

Perhatikan bahwa objek tidak harus a data.table(tetapi juga ingat bahwa pendekatan subset untuk data.frames dan data.tables tidak identik):

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

Jika itu yang Anda miliki, maka mungkin Anda baru saja mencampur posisi baris dan kolom untuk subset data.


Jika Anda tidak ingin memuat paket, Anda dapat mencoba menggunakan grep()untuk mencari string yang Anda cocokkan. Berikut adalah contoh dengan mtcarskumpulan data, di mana kami mencocokkan semua baris yang nama barisnya menyertakan "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

Dan, contoh lain, menggunakan irisdataset untuk mencari string 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

Untuk masalah Anda, coba:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]
A5C1D2H2I1M1N2O1R2T1
sumber
+1: juga catatan yang grepmendukung ekspresi reguler sehingga Anda mungkin ingin menggunakan grep sebagai ^hsa-gantinya.
nico
3
@nico: sebenarnya, grepberasal dari perintah ed g / re / p (global / regular expression / print), dan ini mengungkapkan kekuatan sebenarnya hanya untuk master ekspresi reguler-fu ;-): en.wikipedia.org/ wiki / Grep
Stephan Kolassa
1
The % seperti% saran adalah besar! Saya sarankan untuk meletakkannya di atas jawaban Anda.
Aren Cambre
@ArenCambre, selesai. Mungkin ini akan membantu saya mendapatkan 11 suara lagi sehingga saya bisa mendapatkan topi baru sebelum akhir tahun :-)
A5C1D2H2I1M1N2O1R2T1
@ A5C1D2H2I1M1N2O1R2T1 Jawaban yang bagus! Apakah ada cara untuk menggunakan% like% untuk mencari dua string yang muncul bersamaan (seperti dalam "pet" dan "pip" yang terjadi dalam baris dataframe sebagai "peter piper")?
nigus21
62

Coba str_detect()dari paket stringr , yang mendeteksi ada atau tidaknya pola dalam string.

Berikut adalah pendekatan yang juga menggabungkan %>%pipa dan filter()dari paket 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
...

Ini memfilter contoh kumpulan data CO2 (yang disertakan dengan R) untuk baris di mana variabel Perlakuan berisi substring "non". Anda dapat menyesuaikan apakah str_detectmenemukan kecocokan tetap atau menggunakan regex - lihat dokumentasi untuk paket stringr.

Sam Firke
sumber
Anda juga dapat menggunakan fungsi trc_detect seperti inimyDataFrame[str_detect(myDataFrame$key, myKeyPattern),]
Bemipefe
20

LIKE harus bekerja di 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
pengguna1609452
sumber
SQLDF paling baik untuk daftar. Namun, itu tidak dapat menghapus baris.
Suat Atan PhD
1
Mengapa paket R dimuat di require()sini
rgalbo
Karena ini bukan pustaka R standar dan Anda harus menginstalnya secara manual dan kemudian memuatnya menggunakan requirefungsi.
bartektartanus