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 子组。
- process() 是什么?如果 df2 也可以给我们举个例子吗?由于 Name 中有重复项,我不确定是否要仅基于该变量合并 dfs。
- 这与您在 Cross Validated 上提出的问题不同吗?如果没有,我们应该关闭两者之一,看起来您在那里找到了合适的答案:stats.stackexchange.com/questions/19731/…
- process() 是我自己的函数,它返回一个数据框。每个 new.results 将包含特定名称的 1 行,由 df1、df2 和 df3 名称查询 (df1[df1$Name == name, ]) 返回。
- @Chase:是的,请关闭关于 Crossvalidated 的问题。我不认为我自己能做到这一点。
- @Robert – 我也不能直接关闭它。了解为什么那里提供的答案不能充分回答您的问题会很有帮助。如果您提供一个小的、可重现的问题,您将获得最好的帮助,以便其他人可以简单地复制/粘贴您的代码并查看它的运行情况,或者查看它在哪里无法执行您想要的操作。这个问题有几个关于提供好问题的好技巧:stackoverflow.com/questions/5963269/…
我会看看 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)
这种组合非常有用。祝你好运。
来源:https://www.codenong.com/8489600/