使用与列名称相同的全局变量过滤数据框

时间:2016-10-21 06:41:04

标签: r dplyr

library(dplyr)

玩具数据集:

df <- data.frame(x = c(1, 2, 3), y = c(4, 5, 6))
df
  x y
1 1 4
2 2 5
3 3 6

这很好用:

df %>% filter(y == 5)
  x y
1 2 5

这也可行:

z <- 5
df %>% filter(y == z)
  x y
1 2 5

但这失败了

y <- 5
df %>% filter(y == y)
  x y
1 1 4
2 2 5
3 3 6

显然,dplyr无法区分其列y和全局变量y。 有没有办法告诉dplyr第二个y是全局变量?

2 个答案:

答案 0 :(得分:9)

你可以这样做:

df %>% filter(y == .GlobalEnv$y)

或:

df %>% filter(y == .GlobalEnv[["y"]])

或:

这两个都在这种情况下起作用,但如果所有这一切都在一个函数内部进行,那就不会发生。但是get会:

df %>% filter(y == get("y"))
f = function(df, y){df %>% filter(y==get("y"))}

因此请使用get

或者只使用df[df$y==y,] 代替 dplyr

答案 1 :(得分:6)

可以通过.GlobalEnv对象访问全局环境:

> filter(df, y==.GlobalEnv$y)
  x y
1 2 5

有趣的是,使用访问者函数globalenv()代替.GlobalEnv在这种情况下无效。