ddply:推或拉?

时间:2010-11-16 04:43:30

标签: r plyr

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

1 个答案:

答案 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的帮助页面上找到。