学习理解plyr、ddply
我一直试图通过尝试不同的变量和函数以及观察结果来理解plyr是如何工作的。因此,我更想了解plyr是如何工作的,而不是它所回答的具体修复问题。我已经阅读了文档,但我的新手大脑仍然不明白 一些数据和名称:学习理解plyr、ddply,r,plyr,R,Plyr,我一直试图通过尝试不同的变量和函数以及观察结果来理解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,1
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
如果我输入:ddply(mydf,.(Model),summary,Length+Length)
我会得到相同的结果
现在如果使用transform:ddply(mydf,.(Model),transform,sum=(长度+长度))
我得到:
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,(长度+长度))
那么,为什么添加“sum=”会有所不同呢
问题2:为什么这些不起作用
ddply(mydf,.(Model),sum,Length+Length)
#函数(i)中的错误:未找到对象“Length”
ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) :
传递给“length”的2个参数需要1
这些例子更多地表明,我根本不了解如何使用plyr
欢迎提供任何信息或解释。语法如下:
ddply(data.frame, variable(s), function, optional arguments)
其中,函数应返回data.frame
。在你的情况下,
- Summary是一个函数,它将透明地创建一个新的data.frame,并将表达式的结果作为进一步的参数(…)
- transform是一个基本的R函数,它将转换data.frames(首先由变量拆分),根据作为进一步参数提供的表达式添加新列。这些需要命名,这就是转换的工作方式
如果使用的函数不是subset、transform、mutate、with、in或summary,则需要确保它们返回data.frame(length和sum不返回),或者至少为输出返回一个适当长度的向量。我理解
ddply(…,.(…),summary,…)
操作旨在减少行数,以匹配(…)
分组变量中不同组合的数量。因此,对于您的第一个示例,这似乎很自然:
ddply(mydf, .(Model), summarise, sL = sum(Length)
Model sL
1 a 3
2 b 13
3 c 50
嗯。似乎适合我(不是一个普通的plyr用户)。另一方面,据我所知,transform
操作正在生成与数据帧长度相同的新列。这就是您的第一次转换
调用所完成的。你的第二个(失败)是:
该操作没有为所执行的操作创建新名称,因此结果中没有新的赋值。当您添加sum=(Length+Length)
时,突然有了一个可用的名称(并且没有使用sum
函数)。使用函数名作为列名通常是一个坏主意
关于第二个问题,我认为.fun参数应该是一个plyr函数,或者是一个应用于(拆分)数据帧作为一个整体的有意义的东西,而不是任何旧函数。没有sum.data.frame
函数。但“nrow”或“ncol”确实有道理。你甚至可以让“str”在那个职位上工作。应用于数据帧的长度函数给出列数:
ddply(mydf, .(Model), length ) # all 4's
我发现,当我无法“可视化”R中的任何功能工具时,最简单的方法就是浏览单个实例:
ddply(mydf, .(Model), function(x) browser() )
然后实时检查
x
,这一切都应该是有意义的。然后,您可以在x上测试您的函数,如果它起作用,您将获得金牌(除非其他分组与您的第一个x不同)。此外,我相信OP中的第一组示例只是summarise
和transform
之间默认行为的差异,如果您忽略在表达式中包含类似val=
的标记summary
显然会提供它自己的名称,而transform
似乎会忽略它。
ddply(mydf, .(Model), transform, (Length+Length))
ddply(mydf, .(Model), length ) # all 4's
ddply(mydf, .(Model), function(x) browser() )