論理条件に基づいて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」と呼ばれているが、結果が誤った形式で表示されている場合。
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"), ]
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"))
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
dplyr
パッケージを使用できます。
library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
私はデータフレームで作業していて、提供された答えに運がなく、常に0行を返したので、greplを見つけて使用しました:
df = df[grepl("downlink",df$Transmit.direction),]
これは基本的に、データフレームを[送信方向]列に「ダウンリンク」を含む行のみにトリミングしました。追伸予想される動作が表示されない理由を誰かが推測できる場合は、コメントを残してください。
具体的に元の質問:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
フィルタリングしたい列が、列インデックス2とは異なる位置に表示されたり、変数名を持つ場合があります。
この場合、単純に列名を参照することができます:
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
Which関数を組み込んでいる人はいないようです。フィルタリングにも役立ちます。
expr[which(expr$cell == 'hesc'),]
これもNAを処理し、結果のデータフレームから削除します。
これを9840 x 24データフレームで50000回実行すると、どのメソッドが%in%メソッドよりも実行時間が60%高速になるようです。
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"]