Фильтровать строки data.frame по логическому условию

StackOverflow https://stackoverflow.com/questions/1686569

  •  18-09-2019
  •  | 
  •  

Вопрос

Я хочу фильтровать строки из 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"]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top