R: Совокупная ошибка - «сумма» не имеет значения для факторов - PullRequest
2 голосов
/ 23 октября 2019

Я видел много похожих вопросов на сайте, но почему-то не смог найти ответ на мою проблему. У меня есть фрейм данных, похожий на этот:

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,: 'sum' не имеет значения для факторов

Во всех ответах, которые я видел на этом форуме, говорится, что причина в том, что одна из переменных является фактором, и поэтому суммирование не имеет смысла. Я проверил,и ни одна из моих переменных не является фактором:

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, это не должно быть проблемой, что это символ. Я пытаюсь снова преобразовать все в числовые значения, но ничегокажется, решил мою проблему. Я не уверен, что понимаю, что на самом деле здесь происходит. Я что-то здесь упускаю?

Спасибо за вашу помощь, Клемент

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Я смог сделать то, что хотел, используя dplyr:

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

Он прекрасно работает, поэтому я думаю, что мы можем считать дело закрытым. Однако мне все еще любопытно услышать объяснения о том, что именно здесь происходило.

0 голосов
/ 23 октября 2019

Если вам действительно нужно , чтобы использовать пробелы в именах переменных (вы, вероятно, не), тогда вам нужно использовать обратные ссылки, чтобы ссылаться на них:

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

В любом случае, я советую не использовать пробелы в именах переменных.

...