R - Функция агрегирования разных результатов при добавлении нового столбца группировки - PullRequest
0 голосов
/ 03 июля 2018

Я начинающий R, и я застрял и не могу найти решение. Любые замечания высоко ценятся. Вот проблема:

У меня есть датафрейм df. Столбцы преобразуются в char (Attributes) и num. Я хочу уменьшить размер данных, используя функцию агрегирования (dply не вариант).

Когда я агрегирую, используя

df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1")], sum)

Я получаю правильные результаты. Но я хочу группировать по большему количеству атрибутов. При добавлении дополнительных атрибутов, например

df_agg <- aggregate(df["AMOUNT"], df[c("ATTRIBUTE1", "ATTRIBUTE2")], sum)

тогда в какой-то момент совокупный результат изменится. Сумма Amount больше не равна результату первой первой агрегации (или исходному кадру данных).

Кто-нибудь знает, что вызывает такое поведение.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я думаю, что @Gregor правильно указал, что проблемой может быть группирующая переменная, имеющая NA. dplyr обрабатывает NA в группировке переменных иначе, чем aggregate.

У нас есть альтернативное решение с aggregate. Обратите внимание, что документ предполагает, что

`by`   a list of grouping elements, each as long as the variables in the data
       frame x. The elements are coerced to factors before use.

Вот подсказка. Вы можете преобразовать ваши группирующие переменные в factor, используя exclude="", что обеспечит NA часть фактора.

set.seed(1)

df <- data.frame(ATTRIBUTE1 = sample(LETTERS[1:3], 10, replace = TRUE),
                 ATTRIBUTE2 = sample(letters[1:3], 10, replace = TRUE),
                 AMOUNT = 1:10)

df$ATTRIBUTE2[5] <- NA


aggregate(df["AMOUNT"], by = list(factor(df$ATTRIBUTE1,exclude = ""),
                                  factor(df$ATTRIBUTE2, exclude="")), sum)

#   Group.1 Group.2 AMOUNT
# 1       A       a      1
# 2       B       a      2
# 3       B       b      9
# 4       C       b     10
# 5       A       c     10
# 6       B       c     11
# 7       C       c      7
# 8       A    <NA>      5

Результат, когда группируемые переменные не преобразуются явно в factor для включения NA, выглядит следующим образом:

aggregate(df["AMOUNT"], df[c("ATTRIBUTE1", "ATTRIBUTE2")], sum)
#   ATTRIBUTE1 ATTRIBUTE2 AMOUNT
# 1          A          a      1
# 2          B          a      2
# 3          B          b      9
# 4          C          b     10
# 5          A          c     10
# 6          B          c     11
# 7          C          c      7     
0 голосов
/ 03 июля 2018

Мое лучшее предположение состоит в том, что у вас отсутствуют значения в некоторых столбцах группировки. Демонстрируя встроенные данные mtcars, у которых нет пропущенных значений, все в порядке:

sum(mtcars$mpg)
# [1] 642.9
sum(aggregate(mtcars["mpg"], mtcars[c("am")], sum)$mpg)
# [1] 642.9
sum(aggregate(mtcars["mpg"], mtcars[c("am", "cyl")], sum)$mpg)
# [1] 642.9

Но если мы введем отсутствующее значение в группирующую переменную, оно не будет включено в агрегацию:

mt = mtcars
mt$cyl[1] = NA
sum(aggregate(mt["mpg"], mt[c("am", "cyl")], sum)$mpg)
# [1] 621.9

Самым простым решением было бы заполнить пропущенные значения чем-то отличным от NA, возможно, строкой "missing".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...