ddply:推还是拉?
ddply 在分组数据时是推还是拉? 即,它是否涉及对数据帧的多次传递,还是仅一次?
Does ddply push or pull when grouping data?
I.e, does it involve many passes over the data frame, or just one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您查看代码,您会看到该函数的一般结构:
因此它基本上以更易于使用的格式重新排列变量,然后将数据分成几部分,然后对这些部分使用 ldply。这些片段是由函数 splitter_d 生成的。 Pieces 实际上比列表更复杂一些 - 它是一个指向原始数据的指针和一个索引列表。每当您请求列表中的一部分时,它都会查找匹配的索引并提取适当的数据。这避免了数据的多个副本四处浮动。您可以使用
getAnywhere("splitter_d")
或plyr:::splitter_d
查看其功能。ldply 对每条数据传递一次。之后,它将所有内容组合回数据帧中。实际上,ldply的帮助文件中是这样写的:
我自己也说不出更好的话。奇迹是,第一句话也可以在 ddply 的帮助页面上找到。
If you take a look at the code, you see the general structure of the function:
so it basically rearranges the variables in a format that's easier to use, then breaks the data into pieces, and then use ldply on those pieces. Those pieces are generated by the function splitter_d. Pieces is actually a little bit more sophisticated than a list - it's a pointer to the original data and a list of indices. Whenever you request a piece of the list, it looks up the matching indices and extracts the appropriate data. This avoids having multiple copies of the data floating around. You can see how that functions using
getAnywhere("splitter_d")
orplyr:::splitter_d
.ldply passes once over every piece of data. After that, it combines everything back into a dataframe. Actually, in the help files of ldply is written:
I couldn't say it better myself. And miracle, the first sentence is to be found on the help page for ddply as well.