R:汇总错误-“总和”对因素没有意义

时间:2019-10-22 22:07:31

标签: r aggregate

我在网站上看到了许多类似的问题,但不知何故找不到答案。我有一个看起来像这样的数据框:

head(ftrade)
   Imports Value Exports Value  balance nacer2
1          7349        185712   178363     01
2       4772816      99763470 94990654     01
3       4772816      99763470 94990654     01
4       4772816      99763470 94990654     01
5       1022528       7880815  6858287     01
6       8295652        215331 -8080321

我想通过nacer2汇总我的数据,同时对这些值求和。我的预期输出将是这样的:

    Imports Value Exports Value  balance nacer2
1         50000        100000    50000     01
2         50000        100000    50000     02
3         50000        100000    50000     03
4         50000        100000    50000     04
5         50000        100000    50000     05

其中前三列中的值是原始数据的总和。我运行以下命令:

ftrade <- do.call(data.frame, aggregate(cbind("Exports Value",
                                          "Imports Value",
                                           balance) ~ nacer2, 
                                           data = ftrade,
                                            sum))

返回错误消息:Summary.factor(c(1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,:错误的总和对因子无意义

我在该论坛上看到的所有答案都表明,这是因为变量之一是一个因素,所以求和没有意义。我已经检查过,并且我的变量都不是因素:

str(ftrade)
'data.frame':   11963 obs. of  4 variables:
 $ Imports Value: num  7349 4772816 4772816 4772816 1022528 ...
 $ Exports Value: num  185712 99763470 99763470 99763470 7880815 ...
 $ balance      : num  178363 94990654 94990654 94990654 6858287 ...
 $ nacer2       : chr  "01" "01" "01" "01" ...

由于我正在汇总nacer2,因此它是一个角色应该不成问题。我尝试再次将所有内容转换为数值,但是似乎没有任何解决办法。我不确定在这里到底发生了什么。我在这里想念什么吗?

感谢您的帮助, 克莱门特(Clement)

2 个答案:

答案 0 :(得分:0)

如果您确实需要在变量名中使用空格(您可能不需要),那么您需要使用反引号来引用它们:

names(mtcars)[1] <- 'm p g'

aggregate(cbind(disp, 'm p g') ~ vs, mtcars, sum)
Error in Summary.factor(c(8L, 8L, 18L, 18L, 12L, 12L, 12L, 22L, 21L, 20L,  : 
  ‘sum’ not meaningful for factors
aggregate(cbind(disp, `m p g`) ~ vs, mtcars, sum)
  vs   disp m p g
1  0 5528.7 299.1
2  1 1854.4 343.8

无论如何,我的建议是不要在变量名中使用空格。

答案 1 :(得分:0)

我能够使用dplyr做我想做的事情:

ftrade <- ftrade %>% 
  group_by(nacer2) %>%
  summarise(balance = sum(balance))

它做的很好,所以我认为我们可以考虑结案了。但是,我仍然很好奇听到关于这里到底发生了什么的解释。