2013-05-09 11 views
5

Gibt es eine Möglichkeit, den Wert einer Variablen dem resultierenden Spaltennamen in plyr zuzuweisen? Also in diesem Code ...Wie kann ich dem Spaltennamen in plyr den Wert einer Variablen zuweisen?

column_name <- 'total' 
df <- data.frame(a=c('a','b'), b=c(1,2)) 
ddply(df, .(a), summarise, column_name=sum(b)) 

Wie Sie wissen, spucken diese einen Datenrahmen aus, die a und column_name von Variablen besteht. Was ich jedoch will, sind die Variablen a und total, wobei total dynamisch durch den Wert einer Variablen zugewiesen wird, da ich sie eigentlich innerhalb einer Schleife verarbeiten möchte, die ich nicht direkt innerhalb der ddply-Funktion angeben kann.

Für Sie Informationen, dieser Code funktioniert nicht.

ddply(df, .(a), summarise, get(column_name)=sum(b)) 

Also gibt es eine Lösung, um damit umzugehen?

+0

http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply kann nützlich sein, Sie zu Punkt in einer Richtung. – mnel

Antwort

6

Es gibt mehrere Möglichkeiten:

> column_names <- c('total', 'latot') 
> df <- data.frame(a=c('a','b'), b=c(1,2)) 
> 
> # temporal variable 
> for (cn in column_names) { 
+ ret <- ddply(df, .(a), summarise, ..x=sum(b)) 
+ ret <- rename(ret, c(..x = cn)) 
+ print(ret) 
+ } 
    a total 
1 a  1 
2 b  2 
    a latot 
1 a  1 
2 b  2 
> 
> # ept solution 
> for (cn in column_names) { 
+ print(eval(parse(text = paste0("ret <- ddply(df, .(a), summarise,", cn, "=sum(b))")))) 
+ } 
    a total 
1 a  1 
2 b  2 
    a latot 
1 a  1 
2 b  2 
> 
> # dynamic generation of call 
> for (cn in column_names) { 
+ args <- alist(df, .(a), summarize, sum(b)) 
+ names(args) <- c("", "", "", cn) 
+ print(do.call("ddply", args)) 
+ } 
    a total 
1 a  1 
2 b  2 
    a latot 
1 a  1 
2 b  2 
+0

Eigentlich ging ich zuerst mit eval und ersetzte es später mit Umbenennungsfunktion, da ich einen pathologischen Hass habe, entweder eval oder do.call anzurufen. Ich wollte nur wissen, ob es in einer Zeile machbar ist. Danke für die Antwort. – Blaszard