gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:21:58 31 4
gpt4 key购买 nike

我有一个 data.frame,其中一列包含字符数据。我想从同一列过滤 data.frame 中的多个选项。有没有一种简单的方法可以做到这一点,而我却缺少这种方法?

示例:data.frame 名称 = dat

days      name
88 Lynn
11 Tom
2 Chris
5 Lisa
22 Kyla
1 Tom
222 Lynn
2 Lynn

例如,我想过滤掉 TomLynn
当我这样做时:

target <- c("Tom", "Lynn")
filt <- filter(dat, name == target)

我收到此错误:

longer object length is not a multiple of shorter object length

最佳答案

您需要 %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 相当于说:

return TRUE for every odd value that is equal to "Tom" or every even value that is equal to "Lynn".

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

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

for each value in dat$name, check that it exists in target.

非常不同。结果如下:

[1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

请注意,您的问题与dplyr无关,只是错误使用==

关于r - 在 dplyr 中过滤字符串列上的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25647470/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com