分组数据时ddply是推还是拉? 即,它涉及数据帧上的多次传递,还是只涉及一次?
答案 0 :(得分:5)
如果您查看代码,您会看到该函数的一般结构:
function (.data, .variables, .fun = NULL, ..., .progress = "none",
.drop = TRUE, .parallel = FALSE)
{
.variables <- as.quoted(.variables)
pieces <- splitter_d(.data, .variables, drop = .drop)
ldply(.data = pieces, .fun = .fun, ..., .progress = .progress,
.parallel = .parallel)
}
<environment: namespace:plyr>
所以它基本上以一种更容易使用的格式重新排列变量,然后将数据分成几部分,然后在这些部分上使用ldply。这些片段由函数splitter_d生成。 Pieces实际上比列表更复杂 - 它是指向原始数据和索引列表的指针。无论何时请求列表的一部分,它都会查找匹配的索引并提取相应的数据。这避免了浮动数据的多个副本。您可以使用getAnywhere("splitter_d")
或plyr:::splitter_d
来了解其功能。
ldply在每条数据上传递一次。之后,它将所有内容组合回数据框。实际上,在ldply的帮助文件中写道:
所有plyr函数都使用相同的函数 split-apply-combine策略:他们 将输入分成更简单的部分, 将.fun应用于每一件,然后 将各个部分组合成一个数据 结构体。此功能拆分列表 通过元素并结合结果 进入数据框架。如果没有 结果,然后这个功能会 返回零行数据框 列(data.frame())。
我自己也说不出来。奇迹,第一句话也可以在ddply的帮助页面上找到。