我在其中一列中有一个data.frame
字符数据。
我想从同一列中过滤data.frame
中的多个选项。有没有一种简单的方法可以做到这一点,我错过了?
示例:
data.frame
name = dat
days name
88 Lynn
11 Tom
2 Chris
5 Lisa
22 Kyla
1 Tom
222 Lynn
2 Lynn
例如,我想过滤掉Tom
和Lynn
当我这样做时:
target <- c("Tom", "Lynn")
filt <- filter(dat, name == target)
我收到此错误:
longer object length is not a multiple of shorter object length
答案 0 :(得分:152)
您需要%in%
而不是==
:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
可生产
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
要了解原因,请考虑一下这里发生的事情:
dat$name == target
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
基本上,我们会将两个长target
个向量重复四次,以匹配dat$name
的长度。换句话说,我们正在做:
Lynn == Tom
Tom == Lynn
Chris == Tom
Lisa == Lynn
... continue repeating Tom and Lynn until end of data frame
在这种情况下,我们不会收到错误,因为我怀疑您的数据框实际上有不同数量的行不允许回收,但您提供的示例(8行)。如果样本有一个奇数行,我会得到与你相同的错误。但即使回收工作,这显然不是你想要的。基本上,陈述dat$name == target
等同于:
为每个奇数值返回
的每个偶数值TRUE
,等于&#34; Tom&#34;或者等于&#34; Lynn&#34;。
恰好,样本数据框中的最后一个值是偶数且等于&#34; Lynn&#34;,因此上面的TRUE
。
相比之下,dat$name %in% target
说:
对于
中dat$name
中的每个值,请检查它是否存在于target
。
非常不同。结果如下:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
请注意,您的问题与dplyr
无关,只是误用==
。
答案 1 :(得分:9)
这可以使用dplyr软件包实现,该软件包可在CRAN中使用。实现这一目标的简单方法:
安装dplyr
包。
library(dplyr) df<- select(filter(dat,name=='tom'| name=='Lynn',c('days','name))
说明:
因此,一旦我们下载了dplyr,我们就会使用此软件包中的两个不同函数创建一个新的数据框:
filter:第一个参数是数据框;第二个参数是我们希望它被子集化的条件。结果是整个数据框只有我们想要的行。 select:第一个参数是数据框;第二个参数是我们想要从中选择的列的名称。我们不必使用names()函数,甚至不必使用引号。我们只是将列名列为对象。
答案 2 :(得分:7)
使用base
包:
df <- data.frame(days = c(88, 11, 2, 5, 22, 1, 222, 2), name = c("Lynn", "Tom", "Chris", "Lisa", "Kyla", "Tom", "Lynn", "Lynn"))
# Three lines
target <- c("Tom", "Lynn")
index <- df$name %in% target
df[index, ]
# One line
df[df$name %in% c("Tom", "Lynn"), ]
输出:
days name
1 88 Lynn
2 11 Tom
6 1 Tom
7 222 Lynn
8 2 Lynn
使用sqldf
:
library(sqldf)
# Two alternatives:
sqldf('SELECT *
FROM df
WHERE name = "Tom" OR name = "Lynn"')
sqldf('SELECT *
FROM df
WHERE name IN ("Tom", "Lynn")')
答案 3 :(得分:0)
by_type_year_tag_filtered <- by_type_year_tag %>%
dplyr:: filter(tag_name %in% c("dplyr", "ggplot2"))