論理条件による 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" の場合、ご覧のとおり、結果が間違った形式で返されます。
解決
、 1 の 'cell_type'(例えば 'のhESC')に従って行を選択する==
を使用します。
expr[expr$cell_type == "hesc", ]
、二つ以上の異なる 'cell_type' に従って行を選択する(例えばいずれかの 'のhESC' または 'BJ線維芽')、使用%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")
フィルターしたい列が列インデックス 2 とは異なる位置に表示されたり、変数名が付いている場合があります。
この場合、単純に参照できます。 列名 次のようにフィルタリングしたいとします。
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
私はデータフレームに取り組んで提供さ答えと運を持っなかった、それは常に0行を返したので、私は発見し、greplを使用します:
df = df[grepl("downlink",df$Transmit.direction),]
どの基本的に送信方向の欄に「ダウンリンク」を含ん行のみに自分のデータフレームをトリミング。後記誰もが私が期待される動作を見ていないよ理由として推測できる場合は、コメントを残してくださいます。
具体的に元の質問に:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
誰がどの機能が含まれているように思いません。また、フィルタリングのために有用であることが分かることができます。
expr[which(expr$cell == 'hesc'),]
このものNAを処理し、結果としてデータフレームからそれらをドロップします。
9840 50000データフレーム24によって回でこれを実行すると、それがどの方法が%メソッドで%よりも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"]