创建新数据框时,每个元素是第2个数据框中元素的选定总和,其中2个列元素匹配,sum来自第3列

时间:2017-07-26 14:44:14

标签: r reshape2

我有一个看起来像

的数据框测试
    c1   c2    c3
1   98   0     2013-08
2   231  0     2011-01
3   231  2.68  2011-03
4   231  1     2011-01
... ...  ...   ...

继续增加更多行。列c1的值为1-297,而c3的年度值从2011-01到2015-01连续移动。有多个行具有相同的c1和c3值。

我想在每个时间步骤总结c1的每个实例(因此对于c1 = x和c3 = y的所有行,对这些元素求和并获得结果)并将其输出到每个行代表的新数据帧c1(1-297)中的1个类型,每列是相应的年月。

我试图使用acast(基于建议)将其转换为数据框,其中行基于c1值,c3列,所以看起来像

    2011-01   2011-02  2011-03 ...
1   0         1.5      2.3     ...
2   0         3.4      0       ...
3   5         2.2      1.1     ...
4   4         2.2      4.4     ...
... ...  ...   ...

我一直试图通过acast转换它:

acast(test, test$c3 ~ test$c1, value.var = "c2")

但最终得到的是int类型的矩阵/数据框。行和列是正确的(1-297,2011-01-2015-01),但单元格内的值是错误的。

再次澄清一下,在新数据框中,每个元素将代表第一个数据框中所有元素的总和,这些元素共享相同的c1和c3值。

我认为问题在于,acast看到了匹配的组合,做了一些我不希望它做的事情。我该如何解决这个问题?如果另一个解决方案出现,我不需要acast。

1 个答案:

答案 0 :(得分:1)

您应该使用tidyverse个软件包dplyrtidyr

library(dplyr)
library(tidyr)

df <- test %>%
    group_by(c1, c3) %>%
    summarise(total = sum(c2)) %>%
    spread(c3, total)

实施例

我使用您的简单数据框作为示例:

#>   c1   c2      c3
#> 1  98 0.00 2013-08
#> 2 231 0.00 2011-01
#> 3 231 2.68 2011-03
#> 4 231 1.00 2011-01

运行代码后,df看起来像这样:

#>      c1 `2011-01` `2011-03` `2013-08`
#> 1    98        NA        NA         0
#> 2   231         1      2.68        NA

解释

  • group_by(c1, c3)对数据框中的变量c1c3进行分组
  • summarise(total = sum(c2))总结c2(考虑c1c3分组)
  • spread(c3, total)将数据框转换为广泛的&#34;格式与c3变量跨列