2013-05-09 12 views
5

C'è un modo per assegnare il valore di una variabile al nome della colonna risultante in plyr? Quindi, in questo codice ...Come posso assegnare il valore di una variabile al nome della colonna in plyr?

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

Come sapete, questo sputa fuori un frame di dati che consiste di variabili a e column_name. Tuttavia, quello che voglio ottenere è variabile a e total, dove total viene assegnato dinamicamente dal valore di una variabile, poiché in realtà, voglio elaborarlo all'interno di un ciclo, che non posso specificarlo direttamente all'interno della funzione ddply.

Per informazioni, questo codice non funziona.

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

Quindi c'è qualche soluzione per affrontarlo?

+0

http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply può essere utile per puntare in una direzione. – mnel

risposta

6

Ci sono diversi modi:

> 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

In realtà, per prima cosa ho utilizzato eval e l'ho sostituito in seguito con la funzione rename, poiché ho un odio patologico per chiamare eval o do.call. Volevo solo sapere se è fattibile in una riga. Comunque grazie per la risposta. – Blaszard

Problemi correlati