2014-01-27 10 views
18

Wie kann ich Spaltennamen an dplyr übergeben, wenn ich den Spaltennamen nicht kenne, aber über eine Variable angeben möchte?dplyr Spaltennamen angeben

z.B. dies funktioniert:

require(dplyr) 
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3)) 
df$group <- c("A","B","A") 
gdf <- df %.% group_by(group) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3)) 

Aber dies bedeutet nicht

require(dplyr) 
someColumn = "group" 
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3)) 
df$group <- c("A","B","A") 
gdf <- df %.% group_by(someColumn) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3)) 
+0

ja vielleicht. Ich habe die Gruppensäule vor der dplyr-Kette umbenannt. etwas wie 'colnames (df) [welches (colnames (df) == someColumn)] <-" group "' – user3241888

+0

Es ist erwähnenswert, dass die 'richtige' Antwort wahrscheinlich von den Lösungen unter dplyr 0.7.0 abweicht. – russellpierce

Antwort

-2

Ich erwarte, dass Sie nur noch eval

require(dplyr) 
someColumn = "group" 
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3)) 
df$group <- c("A","B","A") 
gdf <- df %.% group_by(eval(someColumn)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3)) 
+0

Dies funktioniert überhaupt nicht, fügt nur eine neue Spalte mit dem Namen 'eval (someColumn)' hinzu, wobei jede Zeile '' group'' ist. – Gregor

3

Hier ist eine Antwort auf diese einfache Frage verwenden, indem Kommissionierung durch Hadleys Lösung erhalten zu seinem gepeckten Betrogenen.

gdf <- df %.% regroup(lapply(someColumn, as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

FWIW, meine Anwendungsfall Gruppierung durch eine variable Spalte und eine konstante Spalte beteiligt. Die Lösung für das heißt:

gdf <- df %.% regroup(lapply(c('constant_column', someColumn), as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

Schließlich ist die erzielte eval Lösung funktioniert nicht. Das macht nur eine neue Spalte, deren Werte alle someColumneval s sind. Ich bin noch nicht cool genug, um einen Kommentar zu hinterlassen oder ihn zu verwerfen.

-1

enter image description here

pollutant <- "sulfate" 
summarise(data, mean(eval(as.symbol(pollutant)), na.rm = TRUE)) 

Ich habe versucht, die gleiche Frage für mein eigenes Problem zu stellen. Dann habe ich eine Lösung gefunden. Ich kapsle den Ausdruck mit eval (as.symbol()).

+0

Scheint nicht mit meiner aktuellen Version von dplyr zu arbeiten – Calimo

18

Ich gab nur eine ähnliche Antwort über Group by multiple columns in dplyr, using string vector input, aber für ein gutes Maß: Funktionen, mit denen Sie auf Spalten mit Strings arbeiten, wurden dplyr hinzugefügt. Diese haben den gleichen Namen wie die normalen dplyr Funktionen, enden aber in einem Unterstrich. Die Funktionen sind detailliert in this vignette beschrieben.

df und someColumn vom OP gegeben, das funktioniert jetzt ein Genuss:

gdf <- df %>% group_by_(someColumn) %>% summarise(m1=mean(V1),m2=mean(V2),m3=mean(V3)) 

Beachten Sie, dass es group_by_, anstatt group_by und der %>% Operator verwendet wird als %.% veraltet.

0

Sie können summarise_ wie folgt verwendet werden:

plotVar   = "Stocks_US_TotalCrudeOil" 
dfBand <- mydf[ c(plotVar , "year", "week" ) ] %>% 
      filter (year %in% bandYears) %>% 
      group_by ( week) %>% 
      summarise_ ( ymini = paste("min(" , as.name(plotVar) ,")" ) 
         , ymaxi = paste("max(" , as.name(plotVar) ,")" ) ) 
dfBand