tidyverse滤波器的模糊度(%in%)

ifsvaxew  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(113)

今天早些时候,我遇到了一个恼人的问题,我有一个数据框,其中有数百列,我已经得到了。然后我试图从这个数据框中选择行使用的列表,我已经创建了一个不同的进程。当我试图使用列表过滤,我得到了一个空白的数据框作为回报。经过一段时间的努力,我意识到我正在选择的大量 Dataframe 也有一个与我的列表同名的列,并且我的过滤器操作将此作为优先级。
我的问题是,有没有比现在更好的过滤 Dataframe 的方法?我不喜欢使用列或列表时出现歧义。下面是一个最小的例子:
考虑一个有两列a和B的 Dataframe :

library(tidyverse)

df = tibble(a = c("first", "second", "third"),
       b = c("2", "3", "4"))
# A tibble: 3 × 2
#  a      b    
#  <chr>  <chr>
# 1 first  2    
# 2 second 3    
# 3 third  4

然后,我想使用我用另一个过程创建的值列表从这个 Dataframe 中选择行。注意,第一个列表名为B,这也是df中一列的名称。

b = c("first")
d = c("first")

这两个命令几乎相同,只是第一个过滤器基于列(因此不返回任何内容),第二个过滤器基于列表(因此返回第一行):

# Returns Nothing:
df %>%
  filter(a %in% b)
# # A tibble: 0 × 2
# … with 2 variables: a <chr>, b <chr>
# ℹ Use `colnames()` to see all variable names

# Returns Desired Row(s)
df %>%
  filter(a %in% d)
# A tibble: 1 × 2
#  a     b    
#  <chr> <chr>
# 1 first 2

有没有更好的方法来过滤不那么模糊的?我想我会喜欢一个错误或类似的东西。我意识到这是一种边缘情况。

0md85ypi

0md85ypi1#

您可以使用rlang中的.data$和.env$来区分数据集中的变量和环境中的对象。

df %>%
    filter(a %in% .env$b)

A tibble: 1 × 2
  a     b    
  <chr> <chr>
1 first 2
ijxebb2r

ijxebb2r2#

你可以使用!!来计算向量b,而不是使用数据集中的变量b。它也可以处理数据中不是变量名的向量,比如d。所以,如果你经常遇到这种情况,你可以总是用!!作为过滤向量的前缀,这样你就不会遇到这个问题。

library(tidyverse)

df = tibble(a = c("first", "second", "third"),
            b = c("2", "3", "4"))

b = c("first")
d = c("first")

df %>%
  filter(a %in% !!b)
#> # A tibble: 1 × 2
#>   a     b    
#>   <chr> <chr>
#> 1 first 2

df %>%
  filter(a %in% !!d)
#> # A tibble: 1 × 2
#>   a     b    
#>   <chr> <chr>
#> 1 first 2

reprex package(v2.0.1)于2023年2月10日创建

相关问题