#sql #r #dplyr #tidyverse #query-parser
Вопрос:
Я работаю вместе с учебником по SQL, используя queryparser и tidyquery в R. Все шло хорошо, пока меня не попросили это сделать:
SELECT ... SUM(new_vaccinations) OVER (PARTITION BY location) as vaccinations_to_date
Tidyquery сообщил, что он не поддерживает OVER
функции, поэтому я пытаюсь воспроизвести эту OVER (PARTITION BY...)
функцию с помощью dplyr.
Это привело меня with_order(order_by =...
в дплир. Теперь я изо всех сил пытаюсь получить fun =
разрешение на создание столбца совокупной суммы.
library(tidyverse) library(queryparser) library(tidyquery) mydf lt;- data.frame(date = as.Date(c("2021-06-01", '2021-06-02','2021-06-03','2021-06-04', '2021-6-01','2021-6-02','2021-6-03','2021-6-04', '2021-6-01','2021-6-02','2021-6-03','2021-6-04')), location = c('United States','United States','United States','United States', 'Canada','Canada','Canada','Canada','Mexico','Mexico','Mexico','Mexico'), new_vaccinations = c(100,98,32,50,99,34,97,53,35,101,97,56)) test lt;- mydf %gt;% mutate (total_vax = with_order(order_by = location, fun = cumsum(new_vaccinations), x = desc(location)))
Это дает мне ошибку
could not find function "fun"
Неужели я смотрю не в ту кроличью нору, когда дело доходит до воссоздания OVER(PARTITION BY...)
? Если да, то какой вариант лучше? Или я не понимаю, как правильно использовать with_order(order_by =...)
?
Если это неясно, моя цель-создать новую колонку, в которой будет указано общее количество прививок для каждого отдельного местоположения.
Комментарии:
1. Может быть, я что — то упускаю, но я получил суммы прививок по местоположению, просто используя тест lt; — mydf %gt;% group_by(местоположение) % lt; — mydf %gt;gt;% подведение итогов(новые вакцинации)
2. Как выглядят ваши целевые данные, @JamesWheeler?
3. Чтобы ответить Роману и уточнить для @Kylie R. это было то, что я побежал, чтобы получить ответ, который я хотел, благодаря ответу Саймона:
test1 lt;- mydf %gt;% select(date, location, new_vaccinations) %gt;% group_by(location) %gt;% arrange(location, date) %gt;% mutate(new = cumsum(new_vaccinations)) %gt;% arrange(location, date) %gt;% select(date, location, new_vaccinations, new) view(test1)
Ответ №1:
PARTITION BY
Аспект SQL часто может быть реализован с помощью group_by
dplyr .
И ORDER BY
аспект SQL часто может быть выполнен с использованием arrange
dplyr .
Рассмотрим этот код R:
library(dplyr) data(mtcars) mtcars %gt;% select(mpg, cyl) %gt;% group_by(cyl) %gt;% arrange(mpg) %gt;% mutate(new = cumsum(mpg)) %gt;% arrange(cyl, mpg) %gt;% select(cyl, mpg, new)
Эквивалентно этому SQL:
SELECT cyl ,mpg ,SUM(mpg) OVER (PARTITON BY cyl ORDER BY mpg) AS new FROM mtcars
Комментарии:
1. Спасибо тебе за это, Саймон. Я ответил в комментарии на исходный вопрос с окончательным кодом, который я использовал для решения проблемы. Если у меня возникнут какие-либо проблемы при переходе к большему набору данных, вы не будете возражать, если я отправлю их вам? Это было очень полезно!