我想从基于逻辑状态的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

我想什么是得到一个新的数据帧看起来是一样的,但只有具有数据一个单元类型。例如。其中包含的细胞类型子集和/选择行“人类胚胎干细胞”:

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

或任一细胞类型 “BJ成纤维细胞” 或 “人类胚胎干细胞”:

   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”,但它给格式错误的结果,你可以看到。

有帮助吗?

解决方案

要根据选择行的一个 '单元类型'(例如, '人类胚胎干细胞'),使用==

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

这基本上修剪我的数据帧,以只在发送方向上的列包含“下行链路”的行。附:如果任何人都可以,为什么我没有看到预期的行为猜测,请发表评论。

具体而言,以原来的问题:

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

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

没有一个似乎都包括在其中的功能。这也可以证明用于过滤有用。

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

这也将处理的NA,并从所得到的数据帧删除它们。

上的9840×24数据帧50000次运行此,它似乎是该方法具有比%方法中的%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"]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top