Создание столбца совокупной суммы с порядком в R

#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. Спасибо тебе за это, Саймон. Я ответил в комментарии на исходный вопрос с окончательным кодом, который я использовал для решения проблемы. Если у меня возникнут какие-либо проблемы при переходе к большему набору данных, вы не будете возражать, если я отправлю их вам? Это было очень полезно!