我需要处理三个包含按名称索引的相同子组的数据框。也就是说,第一个数据帧df1如下所示:
Name col1 col2
Car 94.56 1
Car 52.67 2
Bike 421.5 2
Bike 34.56 4
df2和df3具有相同的Name列,具有相同的值,只有不同的列。我需要为每个不同的名称处理3个数据帧中的所有行。到目前为止,我一直在使用这种方法:
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()可以按名称对数据帧进行分组,并为每个子组调用process(),但是我无法传入df2和df3子组。
答案 0 :(得分:2)
我会看看威克姆的ddply和plyr。他们听起来很合适。
http://svitsrv25.epfl.ch/R-doc/library/plyr/html/ddply-5k.html
基本思想是在标准上拆分数据框。在您的情况下,使用一个独特的名称,将一个函数应用于每个组(一个罐装的R函数,如总和或自定义的家庭烹饪),然后它们将它们全部重新组合在一起。
我不太了解不同的数据框架,但您可能会发现lapply
更多的运气。您可以构建一个为每个组返回数据框的函数。叫它
output<- lapply(X = as.list(the_list_of_unique_groups), FUN = your_function_for_each_group)
将它缝合在一起
results <- do.call("rbind", output)
这种组合非常有用。祝你好运。