列内の部分的な文字列の一致に基づくデータフレーム行の選択


96

列内の文字列の部分一致に基づいてデータフレームから行を選択したい。たとえば、列 'x'には文字列「hsa」が含まれている。使用sqldf- 構文がある場合like -私は次のようなことをします:

select * from <> where x like 'hsa'

残念ながら、sqldfはその構文をサポートしていません。

または同様に:

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

もちろん、どれもうまくいきません。

誰かがこれを手伝ってくれませんか?


6
あなたは、好ましくは、のようなものを使用して、あなたのデータの数行を投稿することができますdput(head(conservedData))
A5C1D2H2I1M1N2O1R2T1 2012年

回答:


147

%like%現在のアプローチで関数について言及していることに気づきました。それが%like%「data.table」からの参照であるかどうかはわかりませんが、そうであれば、次のように使用できます。

オブジェクトがaである必要はないことに注意してください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-代わりにgrepを使用することもできます。
nico 2012年

3
@nico:実際、grepedコマンドg / re / p(グローバル/正規表現/印刷)に由来し、正規表現のマスターにのみその真の力を明らかにします-fu
ステファンコラサ

1
%のような%の提案は素晴らしいです!回答の上に置くことをお勧めします。
Aren Cambre 2017

@ArenCambre、完了。多分それは私が年末までに新しい帽子を得るかもしれないように私がさらに11票を得るのを助けるでしょう:-)
A5C1D2H2I1M1N2O1R2T1

@ A5C1D2H2I1M1N2O1R2T1正解です。%like%を使用して、一緒に発生する2つの文字列を検索する方法はありますか(「pet」と「pip」が「ピーターパイパー」としてデータフレームの行で発生するなど)。
nigus21

60

文字列内のパターンの有無を検出するストリンガーパッケージstr_detect()から試してください。

以下は、dplyrパッケージからの%>%パイプを組み込んだアプローチです。filter()

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

これは、Rに付属するサンプルCO2データセットを、処理変数に部分文字列「non」が含まれている行に対してフィルタリングします。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が最適です。ただし、行を削除することはできません。
Suat Atan PhD 2017

1
なぜrequire()ここにRパッケージが読み込まれているのですか
rgalbo 2017年

これは標準のRライブラリではないため、手動でインストールし、require関数を使用してロードする必要があるためです。
bartektartanus 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.