感谢您的时间。
这可能是我忽视的一个明显的问题,但今天早上我使用 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
。 - Rui Barradas