为了账号安全,请及时绑定邮箱和手机立即绑定

在dplyr中的字符串列上过滤多个值

在dplyr中的字符串列上过滤多个值

翻翻过去那场雪 2019-09-20 17:25:16
我data.frame在其中一列中有一个字符数据。我想data.frame在同一列中过滤多个选项。有没有一种简单的方法可以做到这一点,我错过了?示例: data.frame name =datdays      name88        Lynn11          Tom2           Chris5           Lisa22        Kyla1          Tom222      Lynn2         Lynn我想过滤一下Tom,Lynn例如。当我做:target <- c("Tom", "Lynn")filt <- filter(dat, name == target)我收到此错误:longer object length is not a multiple of shorter object length
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

你需要%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等于“Tom”的每个奇数值或等于“Lynn”的每个偶数值。


碰巧的是,样本数据框中的最后一个值是偶数并且等于“Lynn”,因此TRUE上面的那个值。


相比之下,dat$name %in% target说:


对于每个值dat$name,检查它是否存在于target。


非常不一样。结果如下:


[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

注意你的问题与之无关dplyr,只是误用了==。


查看完整回答
反对 回复 2019-09-20
?
元芳怎么了

TA贡献1798条经验 获得超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")')


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 806 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信