首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习理解plyr,ddply

学习理解plyr,ddply
EN

Stack Overflow用户
提问于 2012-07-07 06:11:28
回答 3查看 31.2K关注 0票数 23

我一直试图通过尝试不同的变量和函数来了解plyr是如何工作的,并查看结果。所以我更多的是寻找plyr如何工作的解释,而不是它回答的具体修复。我已经看过文档了,但我的新手大脑还是不明白。

一些数据和名称:

代码语言:javascript
复制
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)

我得到了:

代码语言:javascript
复制
`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),我会得到同样的结果。

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

我得到了:

代码语言:javascript
复制
  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))

代码语言:javascript
复制
  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)中出错:找不到对象'Length‘

代码语言:javascript
复制
ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : 

%2个参数传递给了需要%1的“length”

这些例子更多的是为了说明我根本不了解如何使用plyr。

任何作者或解释都很感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-07 06:23:10

语法为:

代码语言:javascript
复制
ddply(data.frame, variable(s), function, optional arguments)

其中函数应返回一个data.frame。在你的情况下,

  • data.frame是一个函数,它将透明地创建一个新的data.frames,并将您提供的表达式的结果作为基础R函数的进一步参数,它将转换该函数(首先由变量拆分),根据您提供的表达式作为进一步的参数添加新列。这些需要命名,这就是转换的工作方式。

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

票数 19
EN

Stack Overflow用户

发布于 2012-07-07 19:05:39

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

代码语言:javascript
复制
ddply(mydf, .(Model), function(x) browser() )

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

票数 22
EN

Stack Overflow用户

发布于 2012-07-07 06:34:24

据我所知,ddply(... , .(...) , summarise, ...)操作的设计目的是减少行数,以匹配.(...)分组变量中的不同组合。因此,对于您的第一个示例,这看起来很自然:

代码语言:javascript
复制
ddply(mydf, .(Model), summarise, sL = sum(Length)
  Model sL
1     a  3
2     b 13
3     c 50

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

代码语言:javascript
复制
ddply(mydf, .(Model), transform, (Length+Length))

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

关于第二个问题,我认为.fun参数需要是一个plyr函数,或者是一些对(拆分)数据帧整体有意义的函数,而不是任何旧函数。没有sum.data.frame函数。但'nrow‘或'ncol’确实有意义。你甚至可以让'str‘在那个位置工作。应用于数据帧的length函数给出列数:

代码语言:javascript
复制
 ddply(mydf, .(Model), length )  # all 4's
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11370323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档