В чем разница между aggregate и group_by в R, когда я пытаюсь суммировать несколько столбцов, сгруппированных по нескольким критериям - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь преобразовать некоторый код R (не написанный мной) в код Python для проекта. Код R использует aggregate () для суммирования, но когда я пытаюсь воспроизвести действие в Python с помощью .groupby, результат отличается. Код R выдает фрейм данных с 479000+ строками, тогда как Python выдает 489000+ строк.

Оказывается позже, я обнаружил, что R также имеет эту функцию group_by (), и при использовании на этом огромном фрейме данных результат совпадает с тем, что дает .groupby в Python

test <- df %>% group_by(A, B, C) %>% 
  summarise(D= sum(D, na.rm=TRUE), E= sum(E,na.rm=TRUE))


test <- aggregate(x=list(D= df$D, E= df$E), by=list(A= df$A, B= df$B, C=df$C), 
                  FUN=function(x) sum(x, na.rm=TRUE))
test= df.groupby(['A', 'B', 'C'],as_index=False)['D', 'E'].agg('sum')

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

Очевидно, что по крайней мере один из этих подходов является неправильным, и две функции должны работать по-разному, чтобы вызвать это. Я действительно хотел бы знать разницу между ними и тем, какая функция правильна в достижении того, что мне нужно (а именно). Большое спасибо.

1 Ответ

1 голос
/ 11 июля 2019

Точную причину трудно узнать, но есть одна потенциальная проблема с aggregate с na.action. По умолчанию он может удалять строки с NA. Можно добавить na.action = na.pass

Используя воспроизводимый пример

set.seed(24)
df1 <- data.frame(col1 = rep(letters[1:4], each = 4), 
     col2 =  sample(c(1:5, NA), 16, replace = TRUE), col3 =  NA)

крайний случай, когда все столбцы равны NA

aggregate(.~ col1, df1, sum, na.rm = TRUE)

Ошибка в aggregate.data.frame (lhs, mf [-1L], FUN = FUN, ...): нет строки для агрегирования

aggregate(.~ col1, df1, sum, na.rm = TRUE, na.action = na.pass)
#  col1 col2 col3
#1    a   13    0
#2    b    5    0
#3    c   11    0
#4    d   16    0

Таким образом, в зависимости от количества NA в любом месте столбцов, эта строка может быть исключена, и это будет отражено в расчете

...