我有一个如下所示的数据框:
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 个小时,这不太实用!但我确信必须有一种方法可以利用现有功能来做到这一点?
预先非常感谢您的帮助!
最佳答案
您可以结合使用 dplyr
和 reshape2
函数来完成此操作。首先,按x
、y
和value
分组(我们将后者的名称更改为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/