2016-10-21 4 views
6
library(dplyr) 

Toy-Datensatz mit:Filter Datenrahmen globalen Variable mit dem gleichen Namen wie Spaltenname

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 

Dies funktioniert:

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

Dies funktioniert auch:

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

Aber das schlägt fehl

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

Offenbar dplyr kann nicht den Unterschied zwischen seiner Säule machen y und der globalen Variable y. Gibt es eine Möglichkeit, dplyr zu sagen, dass das zweite y die globale Variable ist?

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

Interessanterweise mit der Accessorfunktion globalenv() als Ersatz für .GlobalEnv funktioniert nicht in diesem Szenario:

+1

könnte man df%>% filter (y == get ('y')) –

+4

interessante Frage, aber es erinnert mich an den alten "Doktor, tut es weh, wenn ich das tue." "Nun, du könntest versuchen, das nicht zu tun." witz ... –

Antwort

6

können Sie tun:

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

oder:

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

oder:

beide die Arbeit in diesem Zusammenhang aber nicht, ob all dies innerhalb eines vorgeht Funktion. Aber get Wille:

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

So get verwenden.

Oder verwenden Sie einfach df[df$y==y,]anstelle vondplyr.

6

Die globale Umgebung kann über das .GlobalEnv Objekt zugegriffen werden.

+3

'globalenv()' scheitert, weil irgendein Funktionsaufruf mit einem '$ y' darauf scheitert, weil' dplyr' einigen Ausdrücken wie 'foo() $ y' einige schlimme Dinge zu machen scheint, wenn es ein' 'gibt y 'in Ihrem Datenrahmen. Schrecklich. – Spacedman

+1

'globlenv() [[" y "]]' auf der anderen Seite funktioniert. Es ist immer das '$', das Probleme verursacht. – Axeman

+0

Es ist die Nicht-Standard-Bewertung von 'dplyr', die Probleme gibt. Erinnern Sie sich, dass ohne 'dplyr' der Code einfach' df [df $ y == y,] 'ist. – Spacedman

Verwandte Themen