R dplyr奇怪的数据帧过滤(可重现的代码)

时间:2018-03-08 05:37:40

标签: r dataframe filter dplyr

这似乎是dplyr过滤中非常奇怪的行为,有人可以告诉我我在哪里犯错,或者下面是否也出现在你的机器上。先感谢您。

当我尝试使用dplyr过滤数据框时,它在使用原始字符串时工作正常,但在粘贴或使用变量时却没有(至少在我的机器上)。

library(dplyr)

###Recreate data
country <- "ZAF"
df <- data.frame(iso3c=as.character("ZAF"), 
                   country=as.character("South Africa"), 
                   level=as.integer(4),stringsAsFactors = FALSE)

问题是这些过滤了ZAF行,而不是保留它。

###Filters out the ZAF row, none of these work
df.nowork1 <- filter(df, iso3c==country)
df.nowork2 <- filter(df, iso3c==paste(country))
df.nowork3 <- filter(df, iso3c==paste0("'",country,"'"))

我希望他们使用变量:

##Works 
df.works <- filter(df, iso3c=="ZAF")
df.works2 <- filter(df, iso3c==paste("ZAF"))

2 个答案:

答案 0 :(得分:3)

我们可以通过指定不使用bang bang(!!

的数据集列来评估
df %>%
   filter(iso3c== !!country)
#  iso3c      country level
#1   ZAF South Africa     4

或者另一种方法是从.GlobalEnv

中提取对象
filter(df, iso3c== .GlobalEnv$country)
#  iso3c      country level
#1   ZAF South Africa     4

在这里,&#39; df&#39;有一个名为&#39; country&#39;的列,所以在环境中,在指定&#39; country&#39;时,它正在检查列而不是数据集外的对象

df %>%
    select(country)
#        country
#1 South Africa

答案 1 :(得分:1)

我对保持一个名字感到羞怯变量同名。

ctry <- country
works <- filter(df, iso3c==ctry)