2009-11-06 6 views
94

Я хочу фильтровать строки из 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 

То, что я хочу, чтобы получить новый кадр данных, который выглядит так же, но имеет только данные для одной cell_type. Например. Подмножество/выберите строки, в которых содержится тип клеток «ЭСК»:

expr_value  cell_type 
1 5.929771   hesc 
2 5.873096   hesc 
3 5.665857   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"  

, если исходный кадр данных называется «выражение», но это дает результаты в неправильном формате, как вы можете видеть.

ответ

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

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

Имейте в виду, что '' == функция подберут любые NA записи, а также «ЭСК» , тогда как '% in%' не будет. –

+1

@Matt при использовании 'subset' работает так, как ожидалось. –

70

Использование 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")) 
+28

Осторожно! Документация 'subset' имеет большое ПРЕДУПРЕЖДЕНИЕ:« Это удобная функция, предназначенная для использования в интерактивном режиме. Для программирования лучше использовать стандартные функции подмножества, такие как [, и, в частности, нестандартную оценку 0 аргумента * подмножества * может иметь непредвиденные последствия ces. " –

27

Причина 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 
15

Вы можете использовать dplyr пакет:

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

Иногда столбец вы хотите отфильтровать может появиться в другом положении, чем колонки index 2 или иметь имя переменной.

В этом случае, вы можете просто передать имя столбца вы хотите фильтровать, как:

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