在 R 中使用 sum+product 进行重铸

标签 r casting aggregation reshape reshape2

我有一个如下所示的数据框:

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”的唯一组合,而列是每个不同“值”值的“权重”的总和。如果可能的话,我还希望有“value”值的原始计数列。因此,对于这些数据来说:

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 循环来执行此操作,但运行时间非常长 - 到目前为止,完成 600k 行数据集的前 15% 需要 6 个小时,这不太实用!但我确信必须有一种方法可以利用现有功能来做到这一点?

预先非常感谢您的帮助!

最佳答案

您可以结合使用 dplyrreshape2 函数来完成此操作。首先,按xyvalue分组(我们将后者的名称更改为color只是为了避免熔化后重复列名),然后计算每个子组的计数和总和。然后融化结果,将新计算的摘要放入“长”格式。最后,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 进行重铸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38507729/

相关文章:

r - 如何将第三个变量放在水平点图中的右轴上?

R Spark 一次从文件夹中读取一个文件,与 Shiny 集成

c++ - 正确地将有符号转换为无符号

r - geom_tile单色为0,然后是色标

c# - 无法将 List<Foo> 传递给需要 List<IFoo> 的方法,其中 Foo : IFoo

c# - 转换到界面

java-8 - 为 IntStream 生成直方图会引发编译时错误

elasticsearch - 在elasticsearch中,聚合如何在未存储的字段上工作

group-by - 聚合 Dask 数据帧并生成聚合数据帧

r - 如何将字符串解析为真正的等式