tidyverse过滤器行为我不期望(%in% doesn't work with pull())

vxf3dgd4  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(94)

当我尝试使用%in%操作符和pull()子过滤器过滤 Dataframe 时,它不起作用。然而,当我将pull()子查询存储在一个变量中,然后对该变量使用%in%运算符时,它确实起作用了。“
我以著名的mtcars数据集为例。

library(tidyverse)
mydf <- tibble(mtcars)

字符串
假设我想要共享cyl+am+vs的所有观察,则以下代码不起作用:

mydf |> filter(mpg %in% 
mydf |> filter(duplicated(paste0(cyl,am,vs))) |> pull(mpg)
)


错误代码:

Error in `filter()`:
ℹ In argument: `pull(...)`.
Caused by error in `UseMethod()`:
! no applicable method for 'filter' applied to an object of class "logical"


但是,同样的结构,使用变量工作:

mpg_as_var <- mydf |> filter(duplicated(paste0(cyl,am,vs))) |> pull(mpg)
mydf |> filter(mpg %in% mpg_as_var)


我不想只做重复,还要做第一次重复的观察。否则就是一个简单的filter(duplicated()) query
有什么想法吗?

a6b3iqyw

a6b3iqyw1#

在创建的向量周围使用括号,例如

mydf |> filter(mpg %in% 
                       (mydf |> filter(duplicated(paste0(cyl,am,vs))) |> pull(mpg))
      )

# A tibble: 28 × 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 6  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4

字符串

相关问题