关于 r:Multiple data.frame subgroups 处理

Multiple data.frame subgroups processing

我需要处理三个包含按名称索引的相同子组的数据帧。也就是说,第一个数据帧 df1 看起来像这样:

1
2
3
4
5
Name      col1        col2
Car       94.56       1
Car       52.67       2
Bike      421.5       2
Bike      34.56       4

df2 和 df3 具有相同的 Name 列,具有相同的值,只是不同的列。我需要为每个不同的名称处理 3 个数据框中的所有行。到目前为止,我一直在使用这种方法:

1
2
3
4
5
6
7
results = data.frame(name = factor("dummy"), col1 = 1, col2 = 2)
for( name in df1$Name ) {
  new.results = process(name, df1[df1$Name == name, ], df2[df2$Name == name, ], df3[df3$Name == name, ]
  results = rbind(results, new.results)
}

return(results)

这里 process() 返回另一个数据帧,其中包含一些计算的结果。这段代码的问题是 process() 必须返回与 \\'results\\' 数据框相同的布局。如果我更改 process() 返回的内容,我还必须更改 \\'results\\'。还必须删除结果数据框中的第一行。

有没有更简单的方法来做到这一点? by() 可以按名称对 1 个数据帧进行分组,并为每个子组调用 process(),但我不能传入 df2 和 df3 子组。


我会看看 wickham 的 ddply 和 plyr。他们听起来很不错,你的盟友。

http://svitsrv25.epfl.ch/R-doc/library/plyr/html/ddply-5k.html

基本思想是根据标准分割数据框。在您的情况下使用唯一名称,对每个组应用一个函数(像 sum 这样的罐装 R 函数或自定义的自制函数),然后将它们全部缝合在一起。

我不太了解不同的数据帧,但您可能会发现 lapply 更幸运。您可以构建一个函数,为每个组返回一个数据框。调用它
output<- lapply(X = as.list(the_list_of_unique_groups), FUN = your_function_for_each_group)

然后用
results <- do.call("rbind", output)

这种组合非常有用。祝你好运。