我有一个看起来像这样的数据框:
x y value weight
10 1 red 1
3.4 5 blue 2
10 10 blue 0.5
3 8 blue 0.5
3 8 red 4
10 1 blue 1
3 8 blue 2
3 8 blue 0.25
我想重铸它,以便每一行都是“x”和“y”的唯一组合,而列是“值”的每个不同值的“权重”之和。如果可能的话,我也想有一些列用于“值”的原始计数。因此,对于这些数据将是:
x y red_count blue_count red_sum_of_weights blue_sum_of_weights
10 1 1 1 1 1
3.4 5 0 1 0 2
10 10 0 0 1 0.5
3 8 1 3 4 2.75
有没有办法用reshape或reshape2做到这一点?我可以用它来计算值
dcast(data,x+y~value)
但是我还无法弄清楚如何以我想要的方式使用权重。我需要使用它来处理任意数量的可能值级别,以及原始数据集中每个x * y组合的任意不同行数。我已经编写了自己的代码,仅使用for循环来执行此操作,但运行时间非常长-到目前为止,花了6个小时来完成60万行数据集的前15%,这不是很实际!但是我确定必须有一种方法可以对现有功能执行此操作?
非常感谢您的任何帮助!
最佳答案
您可以结合使用dplyr
和reshape2
函数来完成此操作。首先,按x
,y
和value
分组(我们将后者的名称更改为color
只是为了避免熔化后出现重复的列名),然后计算每个子组的计数和总和。然后,对结果进行melt
,以将新计算出的摘要放入“长”格式。最后,dcast
获得您要求的“宽”格式。
library(reshape2)
library(dplyr)
df %>% group_by(x,y,color=value) %>%
summarise(count=n(), sum=sum(weight)) %>%
melt(id.var=c("x","y","color")) %>%
dcast(x + y ~ variable + color)
x y count_blue count_red sum_blue sum_red
1 3.0 8 3 1 2.75 4
2 3.4 5 1 NA 2.00 NA
3 10.0 1 1 1 1.00 1
4 10.0 10 1 NA 0.50 NA
关于r - 用sum + product重铸R,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38507729/