我一直试图通过尝试不同的变量和函数来了解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),我会得到同样的结果。
现在如果使用transform: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)中出错:找不到对象'Length‘
ddply(mydf, .(Model), length, mydf$Length) #Error in .fun(piece, ...) : %2个参数传递给了需要%1的“length”
这些例子更多的是为了说明我根本不了解如何使用plyr。
任何作者或解释都很感谢。
发布于 2012-07-07 06:23:10
语法为:
ddply(data.frame, variable(s), function, optional arguments)其中函数应返回一个data.frame。在你的情况下,
如果使用子集、转换、变异、with、functions或summarise之外的其他函数,则需要确保它们返回一个长度( data.frame和sum不返回),或者至少为输出返回一个适当长度的向量。
发布于 2012-07-07 19:05:39
我发现,当我在“可视化”R中的任何功能工具如何工作时遇到困难时,最简单的做法是浏览单个实例:
ddply(mydf, .(Model), function(x) browser() )然后实时检查x,这一切都应该是有意义的。然后你可以在x上测试你的函数,如果它工作了,你就是黄金级的(除非其他分组与你的第一个x不同)。
发布于 2012-07-07 06:34:24
据我所知,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‘在那个位置工作。应用于数据帧的length函数给出列数:
ddply(mydf, .(Model), length ) # all 4'shttps://stackoverflow.com/questions/11370323
复制相似问题