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



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

559   7  

7 ответов:

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

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", ]

никто, кажется, не включенными в которой функции. Он также может оказаться полезным для фильтрации.

expr[which(expr$cell == 'hesc'),]

Это также будет обрабатывать NAs и отбрасывать их из результирующего фрейма данных.

запуск этого на 9840 на 24 кадра данных 50000 раз, похоже, что метод which имеет 60% более быстрое время выполнения, чем метод% in%.

Я работал над фреймом данных и не имел удачи с предоставленными ответами, он всегда возвращал 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),]

Comments

    Ничего не найдено.