23

我一直试图通过尝试不同的变量和函数并查看结果来了解 plyr 的工作原理和方式。因此,我更多的是寻找关于 plyr 如何工作的解释,而不是具体解决它的答案。我已经阅读了文档,但我的新手大脑仍然没有得到它。

一些数据和名称:

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")
mydf

问题 1:总结与转换语法

所以如果我输入:ddply(mydf, .(Model), summarise, sum = Length+Length)

我得到:

`Model ..1
1     a   2
2     a   4
3     b   6
4     b  20
5     c  40
6     c  60

如果我输入:ddply(mydf, .(Model), summarise, Length+Length)我得到相同的结果。

现在如果使用变换:ddply(mydf, .(Model), transform, sum = (Length+Length))

我得到:

  Model Class Length Speed sum
1     a     e      1     5   2
2     a     e      2    10   4
3     b     e      3    20   6
4     b     e     10    20  20
5     c     e     20    15  40
6     c     e     30    10  60

但是,如果我像第一个总结那样陈述它: ddply(mydf, .(Model), transform, (Length+Length))

  Model Class Length Speed
1     a     e      1     5
2     a     e      2    10
3     b     e      3    20
4     b     e     10    20
5     c     e     20    15
6     c     e     30    10

那么为什么添加“sum =”会有所不同呢?

问题2:为什么这些不起作用?

ddply(mydf, .(Model), sum, Length+Length)#函数(i)中的错误:找不到对象“长度”

ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : 

2 个参数传递给 'length' 需要 1

这些例子更多地表明我根本不了解如何使用 plyr。

任何答案或解释表示赞赏。

4

3 回答 3

22

我发现当我无法“可视化”R 中的任何功能工具如何工作时,最简单的做法是浏览单个实例:

ddply(mydf, .(Model), function(x) browser() )

然后x实时检查,这一切都应该是有意义的。然后,您可以在 x 上测试您的函数,如果它有效,那么您就是黄金(除非其他分组与您的第一个 x 不同)。

于 2012-07-07T11:05:38.560 回答
19

语法是:

ddply(data.frame, variable(s), function, optional arguments)

函数预计返回的位置 a data.frame。在你的情况下,

  • summarise 是一个函数,它将透明地创建一个新的 data.frame,并将您提供的表达式的结果作为进一步的参数 (...)

  • 基本 R 函数 transform 将转换 data.frames(首先由变量拆分),根据您作为进一步参数提供的表达式添加新列。这些需要命名,这就是转换的工作方式。

如果您使用除子集、变换、变异、with、inside 或 summarise 之外的其他函数,您需要确保它们返回一个 data.frame(长度和总和不),或者至少是一个适当的向量输出的长度。

于 2012-07-06T22:23:10.340 回答
4

我理解ddply(... , .(...) , summarise, ...)操作的方式旨在减少行数以匹配.(...)分组变量内不同组合的数量。因此,对于您的第一个示例,这似乎很自然:

ddply(mydf, .(Model), summarise, sL = sum(Length)
  Model sL
1     a  3
2     b 13
3     c 50

好的。似乎对我有用(不是普通的 plyr 用户)。transform另一方面,我理解的操作是创建与数据帧长度相同的新列。这就是你的第一个transform电话完成的。你的第二个(失败)是:

ddply(mydf, .(Model), transform, (Length+Length))

该操作没有为所执行的操作创建新名称,因此结果中没有分配任何新名称。当您添加sum=(Length+Length)时,突然有一个可用的名称,(并且该sum功能使用)。使用函数名作为列名通常是个坏主意。

在问题二上,我认为 .fun 参数需要是一个 plyr 函数或适用于整个(拆分)数据帧而不是任何旧函数的东西。没有sum.data.frame功能。但是“nrow”或“ncol”确实有意义。你甚至可以让 'str' 在那个位置上工作。应用于数据帧的长度函数给出了列数:

 ddply(mydf, .(Model), length )  # all 4's
于 2012-07-06T22:34:24.213 回答