我该如何将变量的值分配给plyr中的列名?

5

有没有办法在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))

有没有解决方法来处理它?


这个链接 https://dev59.com/zWUq5IYBdhLWcg3wKtbs 可能对你有所帮助。 - mnel
1个回答

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

实际上,我最初使用了eval,并稍后将其替换为rename函数,因为我非常讨厌调用eval或do.call。只是想知道是否可以在一行中完成。不过还是谢谢你的回复。 - Blaszard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接