10

我正在使用 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),
                      ...
                      ...
                      ...))

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

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

我知道这不是它实际的完成方式,但我只是想展示我如何概念化它。有没有办法在我在 ddply 中调用的函数中或通过列表来执行此操作?

更新:因为我是新用户,所以我无法发布我自己的问题的答案:

我的回答涉及尼克的回答和伊斯塔的评论中的想法:

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)))
}
4

3 回答 3

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)

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)

它产生如下所示的输出

         .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

这是你要找的吗?

于 2011-05-03T19:51:32.527 回答
4

如果我对您的理解正确,您基本上想将自定义函数应用于ddplydata.frame 中的每一列。

好消息是有一个ddply功能可以做到这一点。这意味着您的问题的解决方案归结为一条线:

以@Ramnath 的优秀示例为基础:

library(ggplot2)
customfunction <- mean
ddply(tips, .(sex, smoker), numcolwise(customfunction))

     sex smoker total_bill      tip     size
1 Female     No   18.10519 2.773519 2.592593
2 Female    Yes   17.97788 2.931515 2.242424
3   Male     No   19.79124 3.113402 2.711340
4   Male    Yes   22.28450 3.051167 2.500000

这样做的原因是colwise将一个作用于向量的函数转换为作用于 data.frame 中的列的函数。有两种变体colwisenumcolwise仅适用于数字列,catcolwise适用于分类列。有关?colwise更多信息,请参阅。

编辑:

感谢您可能不希望将该函数应用于data.frame 中的所有列。不过,我发现这种语法非常简单,我的一般方法是修改我传递给的 data.frame ddply。例如,以下修改示例子集tips以排除某些列。解决方案仍然是单行的:

ddply(tips[, -2], .(sex, smoker), numcolwise(customfunction))

     sex smoker total_bill     size
1 Female     No   18.10519 2.592593
2 Female    Yes   17.97788 2.242424
3   Male     No   19.79124 2.711340
4   Male    Yes   22.28450 2.500000
于 2011-05-03T21:30:41.250 回答
3

在步骤:

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

这是你想要的吗?

于 2011-05-03T18:56:16.570 回答