根据逻辑条件筛选 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

我想要的是得到一个新的数据帧,它看起来相同,但是只有一个 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”,但它给出的结果格式是错误的,正如您所看到的。

382289 次浏览

要根据 ‘ cell _ type’(例如‘ hesc’)选择行,请使用 ==:

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

要根据两个或多个不同的“ cell _ type”(例如,“ 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),]

它基本上将我的数据框削减到仅仅包含传输方向列中的“下行链接”的行。附言。如果有人能猜到为什么我没有看到预期的行为,请留言。

特别是对于最初的问题:

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


expr[grepl("bj fibroblast|hesc",expr$cell_type),]

似乎没有人包含 which 函数,它也可以用于过滤。

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

这还将处理 NAs 并将它们从结果数据框架中删除。

在9840x24数据帧上运行50000次,看起来 which 方法的运行时间比% in% 方法的运行时间快60% 。

我们可以使用 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"]

这对我来说就像魔法一样。

celltype_hesc_bool = expr['cell_type'] == 'hesc'

expr_celltype_hesc = expr[celltype_hesc]

看看这篇博文