【发布时间】:2016-11-25 06:03:46
【问题描述】:
我有一个如下所示的数据框:
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 循环来执行此操作,但是运行需要 非常 很长时间 - 到目前为止,完成 600k 行数据集的前 15% 需要 6 个小时,这不是很实用!但是我确定必须有一种方法可以使用现有功能来做到这一点?
非常感谢您的任何帮助!
【问题讨论】:
-
对于计数,添加
fun.aggregate=length(尽管这是默认设置,因此如果您在至少一个单元格中有多个值,则无论如何它都应该这样做)。 -
非常感谢您的评论!是的,我意识到这是默认设置,这就是为什么,正如我所提到的,我已经能够使用 dcast(data,x+y~value) 来获取原始计数。我无法解决的是如何从“权重”中获取“值”的每个不同值的值的总和。
-
如果您只是使用
dcast,它会是fun.aggregate=sum,但在您的情况下,您需要拆分-应用-组合功能的组合。详情见我的回答。
标签: r casting aggregation reshape reshape2