我有一个看起来像这样的数据框:

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%,这不是很实际!但是我确定必须有一种方法可以对现有功能执行此操作?

非常感谢您的任何帮助!

最佳答案

您可以结合使用dplyrreshape2函数来完成此操作。首先,按xyvalue分组(我们将后者的名称更改为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/

10-12 23:03