2013-05-09 10 views
5

Czy istnieje sposób na przypisanie wartości zmiennej do wynikowej nazwy kolumny w plyr? Więc w tym kodzie ...Jak mogę przypisać wartość zmiennej do nazwy kolumny w plyr?

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

Jak wiesz, to wypluwa ramkę danych, która składa zmiennych a i column_name. Chciałbym jednak, aby zmienne były zmienne a i total, gdzie total jest przypisywany dynamicznie przez wartość zmiennej, ponieważ w rzeczywistości chcę przetworzyć go wewnątrz pętli, którego nie mogę określić bezpośrednio w funkcji ddply.

Dla ciebie informacja, ten kod nie działa.

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

Czy istnieje rozwiązanie tego problemu?

+0

http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply mogą być użyteczne do punktu, w kierunku. – mnel

Odpowiedz

6

Istnieje kilka sposobów:

> 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

Właściwie to po raz pierwszy poszedłem z eval i zastąpiłem go później funkcją zmiany nazwy, ponieważ mam patologiczną nienawiść do wywoływania eval lub do.call. Chciałem tylko wiedzieć, czy jest to wykonalne w jednym wierszu. Dzięki za odpowiedź. – Blaszard

Powiązane problemy