2013-05-09 39 views
5

有什麼辦法可以將變量的值賦給plyr中的結果列名? 所以在這個代碼...如何在plyr中將變量值賦給列名?

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

如你所知,這個吐出它由變量acolumn_name的數據幀。但是,我想要得到的是變量atotal,其中total是由變量的值動態分配的,因爲實際上我想在循環內處理它,所以我不能直接在ddply函數中指定它。

對於您的信息,此代碼不起作用。

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

那麼有什麼解決方案來處理它嗎?

+0

http://stackoverflow.com/questions/14721592/r-dynamically-build-list-in-data-table-or-ddply可能將指向你有用在一個方向。 – mnel 2013-05-09 06:06:23

回答

6

有幾種方法:

> 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

其實,我第一次使用eval,後來用重命名函數替換了它,因爲我有一個病態的仇恨來調用eval或do.call。只是想知道在一條線上是否可行。謝謝你的迴應。 – Blaszard 2013-05-09 14:05:27