ddply:推或拉?

sr1*_*sr1 2 r plyr

分组数据时ddply是推还是拉?即,它涉及数据帧上的多次传递,还是只涉及一次?

Jor*_*eys 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>
Run Code Online (Sandbox Code Playgroud)

所以它基本上以一种更容易使用的格式重新排列变量,然后将数据分成几部分,然后在这些部分上使用ldply.这些片段由函数splitter_d生成.Pieces实际上比列表更复杂 - 它是指向原始数据和索引列表的指针.无论何时请求列表的一部分,它都会查找匹配的索引并提取相应的数据.这避免了浮动数据的多个副本.您可以使用getAnywhere("splitter_d")或查看该功能的用法plyr:::splitter_d.

ldply在每个数据上传递一次.之后,它将所有内容组合回数据框.实际上,在ldply的帮助文件中写道:

所有plyr函数都使用相同的split-apply-combine策略:它们将输入分成更简单的部分,将.fun应用于每个部分,然后将这些部分组合成单个数据结构.此函数按元素拆分列表,并将结果合并到数据框中.如果没有结果,则此函数将返回零行和列的数据框(data.frame()).

我自己也说不出更好.奇迹,第一句话也可以在ddply的帮助页面上找到.