学习理解plyr、ddply

学习理解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

我一直试图通过尝试不同的变量和函数以及观察结果来理解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
如果我输入:
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() )