【问题标题】:How can I assign a variable's value to column name in plyr?如何将变量的值分配给 plyr 中的列名?
【发布时间】:2013-05-03 12:36:57
【问题描述】:

有没有办法将变量的值分配给 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))

那么有什么办法可以解决吗?

【问题讨论】:

标签: r variables plyr columnname


【解决方案1】:

有几种方法:

> 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

【讨论】:

  • 其实我是先用 eval 的,后来用 rename 函数代替,因为我对调用 eval 或 do.call 有病态的仇恨。只是想知道在一行中是否可行。不过感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多