我有一个看起来像
的数据框测试 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。
答案 0 :(得分:1)
您应该使用tidyverse个软件包dplyr
和tidyr
:
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)
对数据框中的变量c1
和c3
进行分组summarise(total = sum(c2))
总结c2
(考虑c1
,c3
分组)spread(c3, total)
将数据框转换为广泛的&#34;格式与c3
变量跨列