web-dev-qa-db-ja.com

論理条件によるdata.frame行のフィルター処理

論理条件に基づいて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 fibroblast」または「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」と呼ばれているが、結果が誤った形式で表示されている場合。

132
lhahne

one 'cell_type'(例: 'hesc')に従って行を選択するには、==を使用します。

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

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

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

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"))
78
rcs

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
29
Ken Williams

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

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

私はデータフレームで作業していて、提供された答えに運がなく、常に0行を返したので、greplを見つけて使用しました:

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

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

具体的に元の質問:

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

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

フィルタリングしたい列が、列インデックス2とは異なる位置に表示されたり、変数名を持つ場合があります。

この場合、単純に列名を参照することができます:

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
2
Daniel Bonetti

Which関数を組み込んでいる人はいないようです。フィルタリングにも役立ちます。

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

これもNAを処理し、結果のデータフレームから削除します。

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

1
eigenfoo

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"]
0
Varn K