web-dev-qa-db-ja.com

列に「hsa ..」のような文字列がある行の選択(部分的な文字列の一致)

マイクロRNAデータを含む371MBのテキストファイルがあります。基本的に、ヒトmicroRNAに関する情報を含む行のみを選択したいと思います。

Read.tableを使用してファイルを読み込みました。通常、私はsqldfで望んでいたことを達成します-「like」構文があれば(miRNAが「hsa」のように*から<>を選択します)。残念ながら、sqldfはその構文をサポートしていません。

Rでこれを行うにはどうすればよいですか?私はstackoverflowを見回しましたが、部分的な文字列の一致を行う方法の例は見ていません。ストリンガーパッケージもインストールしましたが、必要なものがまったくありません。

私がやりたいのは、このようなものです-hsa-*が選択されているすべての行です。

selectedRows <- conservedData[, conservedData$miRNA %like% "hsa-"]

もちろん、これは正しい構文ではありません。

誰かがこれを手伝ってくれますか?読んでくれてありがとう。

アスダ

78
Asda

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

オブジェクトは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), ]
123

stringr パッケージの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
...

これにより、Treatment変数にサブストリング「non」が含まれる行のサンプルCO2データセット(Rに付属)がフィルターされます。 str_detectが固定一致を見つけるか、正規表現を使用するかを調整できます-ストリンガーパッケージのドキュメントを参照してください。

50
Sam Firke

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
19
user1609452