178

我想data.frame根据逻辑条件从 a 中过滤行。假设我有像这样的数据框

   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”,但它以错误的格式给出结果,如您所见。

4

9 回答 9

251

要根据一个“cell_type”(例如“hesc”)选择行,请使用==

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

要根据两个或多个不同的“cell_type”(例如“hesc”“bj fibroblast”)选择行,请使用%in%

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
于 2009-11-06T10:08:47.617 回答
96

使用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"))
于 2009-11-06T10:09:06.400 回答
36

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
于 2009-11-09T17:35:10.607 回答
29

你可以使用这个dplyr包:

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
于 2014-09-04T13:12:25.027 回答
8

似乎没有人包含 which 功能。它也可以证明对过滤很有用。

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

这也将处理 NA 并将它们从结果数据帧中删除。

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

于 2018-07-18T15:04:34.700 回答
7

我正在处理一个数据框并且对提供的答案没有运气,它总是返回 0 行,所以我找到并使用了 grepl:

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

这基本上将我的数据框修剪为仅在传输方向列中包含“下行链路”的行。PS如果有人能猜到为什么我没有看到预期的行为,请发表评论。

具体到原来的问题:

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

expr[grepl("bj fibroblast|hesc",expr$cell_type),]
于 2018-07-06T21:46:29.243 回答
2

有时,您要过滤的列可能出现在与列索引 2 不同的位置或具有变量名称。

在这种情况下,您可以简单地将要过滤的列名称引用为:

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
于 2017-08-10T14:16:52.897 回答
1

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

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

expr_celltype_hesc = expr[celltype_hesc]

检查这篇博文

于 2020-05-23T17:39:32.107 回答
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"]
于 2018-10-24T17:22:08.113 回答