【发布时间】:2019-09-01 00:34:07
【问题描述】:
感谢您的宝贵时间。
这可能是我忽略的一个明显问题,但今天早上我在使用 dplyr::filter() 时遇到了一些意外行为。
使用filter() 似乎有效,除非列名和对象名相同。有关详细信息,请参阅下面的示例。
我希望 data 只返回 data$year 匹配 year 或 data$month 匹配 month 的行,但它会返回所有值。
我以前做过很多次同样的操作,所以我不确定这次为什么会发生。
将month 重命名为month_by_a_different_name 时,一切正常。有任何想法吗?感谢您的宝贵时间。
library(tidyverse)
# Example data
data <-
tibble(
year = c(2019, 2018, 2017),
month = c("January", "February", "March"),
value = c(1, 2, 3)
)
# -----------------------------------------------
# Values to filter by
year <- 2019
month <- "February"
# Assigning year and month to a different object name
year_by_a_different_name <- year
month_by_a_different_name <- month
# -----------------------------------------------
# Filtering using year and month doesn't work
data %>%
dplyr::filter(year == year) # Doesn't work
data %>%
dplyr::filter(month == month) # Doesn't work
# -----------------------------------------------
# Filtering using different names works
data %>%
filter(year == year_by_a_different_name) # Works
data %>%
filter(month == month_by_a_different_name) # Works
# -----------------------------------------------
# Using str_detect() also doesn't work for month
data %>%
dplyr::filter(str_detect(month, month))
# -----------------------------------------------
# Works with base R
data[data$month == month, ]
data[data$year == year, ]
# -----------------------------------------------
# Objects are of same class
class(data$year) == class(year) # TRUE
class(data$month) == class(month) # TRUE
【问题讨论】:
-
丑陋但有效:
filter(year == .GlobalEnv$year)。此外,加载包tidyverse(加载dplyr)后,您不需要dplyr::filter。