Однако я пытаюсь использовать агрегатную функцию для достижения того же результата, что и с запросом SQL:

SQL:

sqldf(" SELECT
                PhotoID,
                UserID,
                SUM(Points) AS PhotoTotalPoints
            FROM Photos
            GROUP BY PhotoId, UserId")
116 186 rows.

R база:

aggregate(x = Photos["Points"]
  , by = Photos[c("PhotoId","UserId")]
  , FUN = sum
)
114 950 rows.

Используя dplyr:

Photos %>%
    group_by(PhotoId,UserId) %>%
    summarise(sum = sum(Points)) 
116 186 rows.

Я новичок в R. Пытался решить эту проблему разными способами, но не нашел объяснения в документах. Что мне не хватает?

2
Tazi 16 Апр 2020 в 02:40

1 ответ

Лучший ответ

Это может быть случай, когда есть NA элементов в одном из столбцов группировки, и если есть NA, по умолчанию aggregate удаляет эту строку. Чтобы предотвратить это, мы можем использовать na.action = NULL

aggregate(Points~ PhotoId + UserId
    , FUN = sum, na.rm = TRUE,  na.action = NULL
   )

Или это может быть случай, когда некоторые неиспользуемые комбинации удаляются с drop = TRUE для метода data.frame

aggregate(x = Photos["Points"]
   , by = Photos[c("PhotoId","UserId")]
   , FUN = sum, na.rm = TRUE, drop = FALSE
   )
2
akrun 15 Апр 2020 в 23:41