意外的ddply()输出。不分组

时间:2014-06-09 22:18:58

标签: r plyr

当我使用ddply计算数字列的平均值时,输出不是我所期望的:

ddply(df, .(df[,1]) summarize, Sales = mean(df[,5]))

输出结果为:

df1[, 4]    Sales
1 X01.01.2012 49761.36
2 X01.02.2012 49761.36
3 X01.03.2012 49761.36
4 X01.04.2012 49761.36
5 X01.05.2012 49761.36
6 X01.06.2012 49761.36

我不明白为什么平均值是相同的,即使按日期排序。不是每个日期销售额不同的预期产出。它计算整列的平均值。

2 个答案:

答案 0 :(得分:2)

第二个参数应为.(variable name)df[,1]引用列中的值,而不是变量的名称。使用mean()

时也是如此

以下是假数据的简短示例,因为您没有提供任何数据。

> df <- data.frame(val1 = 1:5, val2 = 6:10)
> library(plyr)
## correct mean
> ddply(df, .(val1, val2), summarize, mean = mean(c(val1, val2)))
  val1 val2 mean
1    1    6  3.5
2    2    7  4.5
3    3    8  5.5
4    4    9  6.5
5    5   10  7.5
## incorrect mean
> ddply(df, .(df[,1], df[,2]), summarize, mean = mean(c(df[,1], df[,2])))
  df[, 1] df[, 2] mean
1       1       6  5.5
2       2       7  5.5
3       3       8  5.5
4       4       9  5.5
5       5      10  5.5

如果这不能解决您的问题,请提供您的数据样本,以便我们重现您的问题。

答案 1 :(得分:1)

df是整个数据框的名称; ddply并总结不要改变df的含义。 summarize旨在使用命名列,您的列是否具有名称?如果是这样的话,那就看起来像

ddply(df, .(date), summarize, Sales=mean(sales))

按位置处理列的一种方法是代替summarize指定一个对块进行操作的函数:

ddply(df, .(df[,1]), function(chunk) data.frame(Sales=mean(chunk[,5])))

但我宁愿建议您提供数据列名称:

colnames(df)[c(1,5)] <- c("date", "sales")
ddply(df, .(date), summarize, Sales=mean(sales))