Выберите столбец, для которого максимальный другой столбец - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь воссоздать следующий запрос SQLite в dplyr:

SELECT 
  Users.DisplayName, 
  Users.Age, 
  Users.Location, 
  SUM(Posts.FavoriteCount) AS FavoriteTotal, 
  Posts.Title AS MostFavoriteQuestion, 
  MAX(Posts.FavoriteCount) AS MostFavoriteQuestionLikes 
FROM Posts 
JOIN Users 
ON Users.Id=Posts.OwnerUserId 
WHERE Posts.PostTypeId=1 
GROUP BY OwnerUserId 
ORDER BY FavoriteTotal DESC 
LIMIT 10

Как видите, запрос выбирает наиболее понравившийся заголовок для пользователя.

В документах SQLite I прочитайте это:

Примечание: голые столбцы в совокупных запросах. Обычный случай состоит в том, что все имена столбцов в агрегированном запросе являются либо аргументами для агрегатных функций, либо появляются в предложении GROUP BY. Столбец результата, который содержит имя столбца, которого нет в статистической функции и который не указан в предложении GROUP BY (если оно существует), называется «пустым» столбцом.

Когда min () или Агрегатные функции max () используются в агрегированном запросе, все пустые столбцы в наборе результатов принимают значения из входной строки, которая также содержит минимум или максимум. Таким образом, в приведенном выше запросе значение столбца «b» в выходных данных будет значением столбца «b» во входной строке с наибольшим значением «c».

Поэтому, когда движок вычисляет максимальное значение для пользователя, все, что вам нужно сделать, чтобы получить его наиболее понравившийся пост, это просто записать его в выборку.

Однако я изо всех сил пытаюсь сделать то же самое. в dplyr.

Вот что у меня пока так:

Posts %>% 
  inner_join(Users, by = c("OwnerUserId" = "Id")) %>%
  filter(PostTypeId==1) %>% 
  group_by(OwnerUserId, DisplayName, Age, Location) %>% 
  summarise(FavoriteTotal = sum(FavoriteCount), MostFavoriteQuestionLikes = max(FavoriteCount))%>% 
  arrange(desc(FavoriteTotal))

Проблема в том, что summarise возвращает таблицу, в которой только столбцы являются суммированными и сгруппированными. Эта таблица не имеет ссылки на PostId, поэтому я не знаю, как получить к нему доступ. Он содержит только ссылку на пользователя.

Как я могу получить нужный мне Post.Title в dplyr?

Я хотел бы получить таблицу, которая: 1) имеет пользователя 2) имеет сумму всех FavoriteCount всех сообщений, написанных этим пользователем 3) имеет максимальное значение FavoriteCount для этого пользователя 4) имеет заголовок сообщения с максимальным значением FavoriteCount, записанным этим пользователем

Спасибо за вашу помощь и терпение.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Если вы хотите выполнить групповое преобразование без агрегирования фрейма данных, вы просто используете mutate вместо суммирования следующим образом:

Posts %>% 
  inner_join(Users, by = c("OwnerUserId" = "Id")) %>%
  filter(PostTypeId==1) %>% 
  group_by(OwnerUserId, DisplayName, Age, Location) %>% 
  mutate(FavoriteTotal = sum(FavoriteCount), MostFavoriteQuestionLikes = max(FavoriteCount))%>% 
  arrange(desc(FavoriteTotal))
0 голосов
/ 17 апреля 2020

Попробуйте:

library(tidyverse)
Posts %>% 
  inner_join(Users, by = c("OwnerUserId" = "Id")) %>%
  filter(PostTypeId==1) %>% 
  group_by(OwnerUserId, DisplayName, Age, Location) %>% 
  summarise(FavoriteTotal = sum(FavoriteCount), 
            MostFavoriteQuestionLikes = max(FavoriteCount),
            MostFavoriteQuestion = unique(PostsTypeId)) %>% 
  arrange(desc(FavoriteTotal)) %>% 
  top_n(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...