今天早些时候,我遇到了一个恼人的问题,我有一个数据框,其中有数百列,我已经得到了。然后我试图从这个数据框中选择行使用的列表,我已经创建了一个不同的进程。当我试图使用列表过滤,我得到了一个空白的数据框作为回报。经过一段时间的努力,我意识到我正在选择的大量 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
有没有更好的方法来过滤不那么模糊的?我想我会喜欢一个错误或类似的东西。我意识到这是一种边缘情况。
2条答案
按热度按时间0md85ypi1#
您可以使用rlang中的.data$和.env$来区分数据集中的变量和环境中的对象。
ijxebb2r2#
你可以使用
!!
来计算向量b
,而不是使用数据集中的变量b
。它也可以处理数据中不是变量名的向量,比如d
。所以,如果你经常遇到这种情况,你可以总是用!!
作为过滤向量的前缀,这样你就不会遇到这个问题。由reprex package(v2.0.1)于2023年2月10日创建