根据列中的条件对数据框中的行进行子集/筛选

Subset / filter rows in a data frame based on a condition in a column

提问人:wishihadabettername 提问时间:8/10/2010 最后编辑:Henrikwishihadabettername 更新时间:9/12/2022 访问量:335564

问:

给定一个数据框“foo”,我怎样才能从“foo”中只选择那些行,例如?foo$location = "there"

foo = data.frame(location = c("here", "there", "here", "there", "where"), x = 1:5, y = 6:10)
foo
#   location x  y
# 1     here 1  6
# 2    there 2  7
# 3     here 3  8
# 4    there 4  9
# 5    where 5 10

期望的结果,“bar”:

#   location x y
# 2    there 2 7
# 4    there 4 9
数据帧 子集 R-FAQ

评论


答:

141赞 JoFrhwld 8/10/2010 #1

以下是两种主要方法。我更喜欢这个,因为它的可读性:

bar <- subset(foo, location == "there")

请注意,您可以将许多条件与 和 串在一起,以创建复杂的子集。&|

第二种是索引方法。可以在 R 中使用数字或布尔切片为行编制索引。 返回与 的行长度相同的 和值的向量。您可以这样做以仅返回条件返回 true 的行。foo$location == "there"TFfoo

foo[foo$location == "there", ]

评论

2赞 Chetan Arvind Patil 8/10/2017
.@JoFrhwld - 不是首选方法吗?详细讨论在这里subset()
0赞 schoon 9/15/2017
有没有一种简单的方法可以同时访问子集和 foo 减去子集?我想将我的数据拆分为 bar 和 (foo-bar)。显然,我可以用 != 重复上述内容,但是有没有单行方法?
0赞 Sumedha Nagpal 12/3/2019
您好,我正在学习索引,我有一个问题。例如,鉴于可以在此处提取一组特定的列,如果我尝试为这些列赋值,会发生什么情况:foo[foo$location == '"there",5:8]foo[foo$location == "there",5:8] <-FALSE
0赞 A1aks 6/11/2020
解释得很好。!
6赞 DryLabRebel 10/1/2018 #2

为了扩展上面的答案,您还可以为列编制索引,而不是指定列名称,这也很有用,具体取决于您正在执行的操作。假设您的位置是第一个字段,它将如下所示:

    bar <- foo[foo[ ,1] == "there", ]

这很有用,因为您可以对列值执行操作,例如遍历特定列(也可以通过索引行号来执行相同的操作)。

如果需要对多个列执行某些操作,这也很有用,因为这样可以指定列范围:

    foo[foo[ ,c(1:N)], ]

或特定列,如您所料。

    foo[foo[ ,c(1,5,9)], ]
2赞 Quinten 9/12/2022 #3

另一种选择是使用 中的函数 filter。下面是一个可重现的例子:dplyr

foo = data.frame(location = c("here", "there", "here", "there", "where"), x = 1:5, y = 6:10)
library(dplyr)
filter(foo, location == "there")
#>   location x y
#> 1    there 2 7
#> 2    there 4 9

创建于 2022-09-11 with reprex v2.0.2