2013-01-31 10 views
40

data.tableに文字列があり、その中に部分文字列を含む行のみを選択したいとします。 SQLに相当。WHERE x LIKE '%substring%'サブストリングの一致に基づいてR data.tableの行を選択するには

など。

> Months = data.table(Name = month.name, Number = 1:12) 
> Months["mb" %in% Name] 
Empty data.table (0 rows) of 2 cols: Name,Number 

名前に「mb」が含まれている行のみを選択するにはどうすればよいですか?

答えて

72

data.tablelike機能を有することにより、行のサブセット。

Months[like(Name,"mb")] 
     Name Number 
1: September  9 
2: November  11 
3: December  12 

あるいは、%like%に見えるよりよい:

> Months[Name %like% "mb"] 
    Name Number 
1: September  9 
2: November  11 
3: December  12 

なお%like%like()使用grepl(論理ベクトルを返す)よりもむしろgrep(戻り整数位置)。あまりにも、

> Months[Number<12 & Name %like% "mb"] 
     Name Number 
1: September  9 
2: November  11 

、あなたは正規表現検索(だけでなく、%または*ワイルドカード)の電力を得る:それはそう、それは他の論理条件と組み合わせることができます。

+0

このコマンドを使用して '<-'を付けずにテーブルを更新する方法はありますか、' Months [Name == like(Name、 "mb")]]のようなものを考えていました。 ' –

+0

@RafaelPereira' ?data.table'(例)、ドキュメントを読んでDataCampコースを取ったのですか? 'Months [like(Name、" mb ")、someCol:= someValue] –

+0

@ Matt-Dowleのご提案ありがとうございました。多分私は十分にはっきりしていなかったでしょう。 [私はあなたにこれを尋ねるつもりだった](http://stackoverflow.com/questions/32882768/subset-data-table-without-using)。 –

7

オペレータ%in%は、それはあなたがgrep()機能を使用する必要が一致する部分文字列を行うには値が値の別のセットに存在する場合、すなわち"a" %in% c("a","b","c")

を発見するために使用されている にマッチする部分文字列を行いません。 grepを使用して、"mb"を含むすべての列のインデックスを返すことができます。そのインデックス

Months[grep("mb", Name)] # data.table syntax slightly easier 
+2

本当にありがとう、infact月間[grep( "mb"、Name)] 'は動作しているようです。 – Corone

+0

これは、名前をワークスペースの別の場所にある別のベクターとして定義した場合にのみ有効です。どの変数を使用しているか注意してください – LostLin

+1

これはdata.tableとdata.frameのため動作していませんか? – Corone

関連する問題