按逻辑条件筛选data.frame行
我想根据逻辑条件过滤按逻辑条件筛选data.frame行,r,dataframe,subset,r-faq,R,Dataframe,Subset,R Faq,我想根据逻辑条件过滤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
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
我想要的是得到一个新的数据帧,它看起来相同,但只有一个单元格类型的数据。例如,子集/选择包含单元格类型“hesc”的行:
或细胞类型“bj成纤维细胞”或“hesc”:
有什么简单的方法可以做到这一点吗
我试过:
expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc" "hesc" "hesc"
如果原始数据帧被称为“expr”,但它以错误的格式给出结果,如您所见。要根据一个“单元格类型”(例如“hesc”)选择行,请使用
=
:
expr[expr$cell_type == "hesc", ]
要根据两个或两个以上不同的“细胞类型”(例如“hesc”或“bj成纤维细胞”)选择行,请使用%:
expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
使用子集
(用于交互使用)
或者更好的dplyr::filter()
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")]
这对我来说就像变魔术一样
celltype\u hesc\u bool=expr['cell\u type']=='hesc'
expr\u celltype\u hesc=expr[celltype\u hesc]
请注意,
=
功能将拾取任何NA记录以及“hesc”,而%中的%则不会。我想知道这现在是否有效?我无法以这种方式根据条件对数据帧进行子集。小心!subset
的文档中有一个很大的警告:“这是一个便于交互使用的函数。对于编程来说,最好使用像[]这样的标准子集函数,尤其是参数子集的非标准计算可能会产生意想不到的后果。”这也将拾取任何NA
记录!因此,不适用。这也将拾取任何NA
记录!因此,不适用。这似乎是正确的原因,因为expr dataframe在过滤列中没有NA
。如果那里有NA
,您的方法就不适用了,正如我所说的之前。感谢您对如何处理列和行的解释。
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'),]
library(data.table)
expr <- data.table(expr)
expr[cell_type == "hesc"]
expr[cell_type %in% c("hesc","fibroblast")]
expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]