题
我想从基于逻辑状态的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"]
不隶属于 StackOverflow