Фильтрация строк данных.файла по логическому условию

Я хочу фильтровать строки из 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. Например. подмножество/выбор строк, которые содержат тип ячейки "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

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

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

Ответ 2

Используйте 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"))

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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