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

Creating new data frame, each element is a selected sum of elements in 2nd data frame where 2 column elements match, sum is from third column

我有一个数据框,测试,看起来像

    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 的所有行,对这些元素求和并得到结果)并将其输出到一个新的数据框,其中每个row代表c1中的1个类型(1-297),每一列是对应的年月。

我正在尝试使用 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")

但最终得到一个 matrix/data 类型为 int 的框架。行和列是正确的 (1-297, 2011-01 - 2015-01),但是单元格内的值是错误的。

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

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

你应该使用 tidyversedplyrtidyr:

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) 将数据框转换为 "wide" 格式,其中 c3 变量跨列