178

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」と呼ばれている場合、ご覧のとおり、結果が間違った形式になります。

4

9 に答える 9

251

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

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

2 つ以上の異なる 'cell_type' (たとえば、'hesc'または'bj fibroblast' のいずれか) に従って行を選択するには、次を使用します%in%

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
于 2009-11-06T10:08:47.617 に答える
96

利用する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"))
于 2009-11-06T10:09:06.400 に答える
36

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
于 2009-11-09T17:35:10.607 に答える
29

dplyrパッケージを使用できます:

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
于 2014-09-04T13:12:25.027 に答える
8

誰も which 関数を含めていないようです。また、フィルタリングにも役立ちます。

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

これにより、NA も処理され、結果のデータフレームから削除されます。

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

于 2018-07-18T15:04:34.700 に答える
7

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

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

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

具体的には元の質問に:

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

expr[grepl("bj fibroblast|hesc",expr$cell_type),]
于 2018-07-06T21:46:29.243 に答える