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

r subset dataframe

208180 просмотра

8 ответа

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

Автор: lhahne Источник Размещён: 17.05.2019 03:59

Ответы (8)


163 плюса

Решение

Чтобы выбрать строки в соответствии с одним «cell_type» (например, «hesc»), используйте ==:

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

Чтобы выбрать строки в соответствии с двумя или более разными «cell_type» (например, «hesc» или «bj fibroblast»), используйте %in%:

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
Автор: learnr Размещён: 06.11.2009 10:08

73 плюса

Использование 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"))
Автор: rcs Размещён: 06.11.2009 10:09

28 плюса

Причина 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
Автор: Ken Williams Размещён: 09.11.2009 05:35

19 плюса

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

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
Автор: nathaneastwood Размещён: 04.09.2014 01:12

2 плюса

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

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

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
Автор: Daniel Bonetti Размещён: 10.08.2017 02:16

1 плюс

Я работал над фреймворком данных и не повезло с предоставленными ответами, он всегда возвращал 0 строк, поэтому я нашел и использовал grepl:

df = df[grepl("downlink",df$Transmit.direction),]

Который в основном подрезал мою фреймворк только к строкам, содержащим «нисходящую линию» в столбце направления передачи. PS Если кто-то может догадаться, почему я не вижу ожидаемого поведения, оставьте комментарий.

В частности, исходный вопрос:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]
Автор: Justin Harbour Размещён: 06.07.2018 09:46

1 плюс

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

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

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

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

Автор: christopher van hoecke Размещён: 18.07.2018 03:04

0 плюса

мы можем использовать библиотеку 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"]
Автор: Varn K Размещён: 24.10.2018 05:22
Вопросы из категории :
32x32