按逻辑条件筛选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"]