Фильтровать строки 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
Я хочу получить новый фрейм данных, который выглядит так же, но содержит данные только для одного типа ячейки.Например.подмножество/выберите строки, содержащие тип ячейки "hesc":
expr_value cell_type
1 5.929771 hesc
2 5.873096 hesc
3 5.665857 hesc
Или любой тип клеток «фибробласт bj» или «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», но, как вы можете видеть, он дает результаты в неправильном формате.
Решение
Чтобы выбрать строки в соответствии один 'тип_ячейки' (например.'hesc'), используйте ==
:
expr[expr$cell_type == "hesc", ]
Чтобы выбрать строки в соответствии с двумя или более разными типами ячеек (например,либо '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),]
По сути, мой фрейм данных был обрезан только до тех строк, которые содержали слово «нисходящая линия связи» в столбце «Направление передачи».P.S.Если кто-нибудь может догадаться, почему я не вижу ожидаемого поведения, оставьте комментарий.
Конкретно к исходному вопросу:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
Кажется, никто не включил функцию who.Это также может оказаться полезным для фильтрации.
expr[which(expr$cell == 'hesc'),]
Это также будет обрабатывать NA и удалять их из результирующего кадра данных.
Запустив это на кадре данных размером 9840 на 24 50 000 раз, кажется, что метод Which имеет время выполнения на 60% быстрее, чем метод %in%.
мы можем использовать библиотеку 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"]