创建新数据框,每个元素是第二个数据框中元素的选定总和,其中 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。
你应该使用 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)
将数据框转换为 "wide" 格式,其中 c3
变量跨列
我有一个数据框,测试,看起来像
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。
你应该使用 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)
将数据框转换为 "wide" 格式,其中c3
变量跨列