web-dev-qa-db-ja.com

grepを使用してRのデータフレームのサブセット化を支援する

データのサブセット化に問題があります。最初の3文字がG45で始まる列xでサブセット化されたデータが必要です。

私のデータフレーム:

 x <- c("G448", "G459", "G479", "G406")  
 y <- c(1:4)
 My.Data <- data.frame (x,y)

私が試してみました:

 subset (My.Data, x=="G45*")

しかし、ワイルドカードの使用方法がわかりません。インデックスを見つけるためにgrep()も試しました。

 grep  ("G45*", My.Data$x)

しかし、G45で始まる行だけでなく、4行すべてを返します。おそらく、ワイルドカードの使用方法がわからないためです。

30
Stewart Wiseman

_[_を使用して抽出するのは非常に簡単です:

grepは、検索パターンに一致した位置を提供します(_value = TRUE_を使用しない限り)。

_grep("^G45", My.Data$x)
# [1] 2
_

単一の列の値内で検索しているため、実際には行インデックスに対応します。そのため、_[_(_My.Data[rows, cols]_を使用して特定の行と列を取得する場所)で使用します。

_My.Data[grep("^G45", My.Data$x), ]
#      x y
# 2 G459 2
_

subsetのヘルプページでは、_[_よりもこの関数を使用する場合、grepおよびgreplsubsetとともに使用する方法を示しています。以下に例を示します。

_subset(My.Data, grepl("^G45", My.Data$x))
#      x y
# 2 G459 2
_

R 3.3では、startsWith関数も使用できるようになりました。この関数は、subset(または上記の他のアプローチ)で再び使用できます。関数のヘルプページによると、substringまたはgreplを使用するよりもかなり高速です。

_subset(My.Data, startsWith(as.character(x), "G45"))
#      x y
# 2 G459 2
_
52

stringrパッケージを使用することもできます

library(dplyr)
library(stringr)
My.Data %>% filter(str_detect(x, '^G45'))

この場合、'^'(で始まる)を使用して、必要な結果を取得することはできません

0
Ayan