分组数据时 ddply 是推还是拉?即,它是否涉及数据帧上的多次传递,还是只涉及一次?
问问题
421 次
1 回答
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 的帮助页面上找到。
于 2010-11-16T09:45:55.747 回答