循环在ddply中创建新变量

Iri*_*sui 10 for-loop r plyr

我正在使用ddply来聚合和汇总数据框变量,我有兴趣循环遍历我的数据框列表来创建新变量.

new.data <- ddply(old.data, 
                  c("factor", "factor2"),
                  function(df)
                    c(a11_a10 = CustomFunction(df$a11_a10),
                      a12_a11 = CustomFunction(df$a12_a11),
                      a13_a12 = CustomFunction(df$a13_a12),
                      ...
                      ...
                      ...))
Run Code Online (Sandbox Code Playgroud)

有没有办法让我在ddply中插入一个循环,以便我可以避免编写每个新的汇总变量,例如

for (i in 11:n) {
  paste("a", i, "_a", i - 1) = CustomFunction(..... )
}
Run Code Online (Sandbox Code Playgroud)

我知道这不是它实际完成的方式,但我只是想表明我是如何构思它的.有没有办法在ddply或通过列表调用的函数中执行此操作?

更新:因为我是新用户,我无法回答我自己的问题:

我的回答涉及Nick的回答和Ista评论的想法:

func <- function(old.data, min, max, gap) {
  varrange <- min:max
  usenames <- paste("a", varrange, "_a", varrange - gap, sep="")
  new.data <- ddply(old.data,
                    .(factor, factor2),
                    colwise(CustomFunction, c(usenames)))
}
Run Code Online (Sandbox Code Playgroud)

Ram*_*ath 7

在@Nick的优秀答案的基础上,这是解决问题的一种方法

foo <- function(df){
  names   = paste("a", 11:n, "_a", 10:(n-1), sep = "")
  results = sapply(df[,names], CustomFunction)
}

new.data = ldply(dlply(old.data, c("factor", "factor2")), foo)
Run Code Online (Sandbox Code Playgroud)

以下是使用tips数据集的示例应用程序ggplot2.假设我们想要计算平均值tiptotal_bill组合,sex以及smoker代码的工作方式

foo = function(df){names = c("tip", "total_bill"); sapply(df[,names], mean)}
new = ldply(dlply(tips, c("sex", "smoker")), foo)
Run Code Online (Sandbox Code Playgroud)

它产生如下所示的输出

         .id      tip total_bill
1  Female.No 2.773519   18.10519
2 Female.Yes 2.931515   17.97788
3    Male.No 3.113402   19.79124
4   Male.Yes 3.051167   22.28450
Run Code Online (Sandbox Code Playgroud)

这是你在找什么?