論理条件でdata.frame行をフィルタリングする


155

data.frame論理条件に基づいてから行をフィルタリングします。私のようなデータフレームがあるとしましょう

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc
7    6.791656          hips
8    7.133673          hips
9    7.574058          hips
10   7.208041          hips
11   7.402100          hips
12   7.167792          hips
13   7.156971          hips
14   7.197543          hips
15   7.035404          hips
16   7.269474          hips
17   6.715059          hips
18   7.434339          hips
19   6.997586          hips
20   7.619770          hips
21   7.490749          hips

私がやりたいのは、同じに見えるが1つのcell_typeのデータのみを含む新しいデータフレームを取得することです。たとえば、サブセット/セルタイプ「hesc」を含む行を選択します。

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

または、セルタイプ「bj線維芽細胞」または「hesc」:

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc

これを行う簡単な方法はありますか?

私はもう試した:

expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc"     "hesc"     "hesc"    

元のデータフレームが "expr"と呼ばれているが、ご覧のように間違った形式で結果が返される場合。

回答:


210

1つの 'cell_type'( 'hesc'など)に従って行を選択するには、次を使用します==

expr[expr$cell_type == "hesc", ]

2つ以上の異なる「cell_type」(たとえば、「hesc」または「bj線維芽細胞」)に従って行を選択するには、次を使用します%in%

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]

28
この==関数はNAレコードと「hesc」を取得しますが、取得しないことに注意してください%in%
Matt Parker、

これは今うまくいくのかしら?このように、条件に基づいてデータフレームをサブセット化することができませんでした。
Sumanth Lazarus

85

使用subset(インタラクティブ使用)

subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))

以上 dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))

37
気をつけて!のドキュメントにsubsetは大きな警告があります:「これはインタラクティブに使用することを目的とした便利な関数です。プログラミングでは、[のような標準サブセット化関数を使用することをお勧めします。特に、引数サブセットの非標準のd評価は予期しない結果を招く可能性があります。」
Aleksandar Dimitrov 2013年

33

expr[expr[2] == 'hesc']機能しない理由は、データフレームの場合、x[y]行ではなく列を選択するためです。行を選択する場合は、x[y,]代わりに構文に変更します。

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc

これにより、NAレコードも取得されます。したがって、該当しません。それが本当であるように思われた理由は、exprデータフレームがNAフィルターされた列にないという事実に起因しました。あるとしたらNA、先ほど言ったようにあなたのやり方は当てはまりません。
Erdogan CEVHER

26

あなたはdplyrパッケージを使うことができます:

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")

5

which関数を組み込んだ人はいません。また、フィルタリングにも役立ちます。

expr[which(expr$cell == 'hesc'),]

これはNAも処理し、結果のデータフレームからドロップします。

これを9840 x 24データフレームで50000回実行すると、%in%メソッドよりも実行時間が60%速い方法のようです。


4

私はデータフレームに取り組んでいて、提供された回答でうまくいかなかったため、常に0行を返したため、greplを見つけて使用しました。

df = df[grepl("downlink",df$Transmit.direction),]

これは基本的に、送信方向列に「ダウンリンク」を含む行のみにデータフレームをトリミングしました。PS予想される動作が表示されない理由を誰かが推測できる場合は、コメントを残してください。

具体的には元の質問に:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

3

場合によっては、フィルター処理する列が列インデックス2とは異なる位置に表示されるか、変数名を持つことがあります。

この場合、フィルターしたい列名を単に次のように参照できます。

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]

これにより、NAレコードも取得されます。したがって、該当しません。
Erdogan CEVHER

0

data.tableライブラリを使用できます

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

または%like%パターンマッチングの演算子を使用してフィルタリング

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.