提问人:wishihadabettername 提问时间:8/10/2010 最后编辑:Henrikwishihadabettername 更新时间:9/12/2022 访问量:335564
根据列中的条件对数据框中的行进行子集/筛选
Subset / filter rows in a data frame based on a condition in a column
问:
给定一个数据框“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
答:
141赞
JoFrhwld
8/10/2010
#1
以下是两种主要方法。我更喜欢这个,因为它的可读性:
bar <- subset(foo, location == "there")
请注意,您可以将许多条件与 和 串在一起,以创建复杂的子集。&
|
第二种是索引方法。可以在 R 中使用数字或布尔切片为行编制索引。 返回与 的行长度相同的 和值的向量。您可以这样做以仅返回条件返回 true 的行。foo$location == "there"
T
F
foo
foo[foo$location == "there", ]
评论
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
评论