【问题标题】:Creating a cumulative sum column with_order in R在R中使用_order创建一个累积和列
【发布时间】:2021-12-23 10:36:15
【问题描述】:

我正在编写一个在 R 中使用 queryparser 和 tidyquery 的 SQL 教程。这一直进展顺利,直到我被要求这样做:

SELECT ... SUM(new_vaccinations) OVER (PARTITION BY location) as vaccinations_to_date

Tidyquery 报告说它不支持 OVER 函数,所以我尝试使用 dplyr 复制 OVER (PARTITION BY...) 函数。

这使我在 dplyr 中找到了with_order(order_by =...。现在我正在努力让fun = 允许我创建一个累积总和列。

library(tidyverse)
library(queryparser)
library(tidyquery)

mydf <- 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 <- mydf %>% 
  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 =...)

如果不清楚,我的目标是创建一个新列,以保持每个单独位置的疫苗接种总数。

【问题讨论】:

  • 也许我遗漏了一些东西,但我仅使用测试就按位置获得了疫苗接种的总和 % group_by(location) %>% summarise(new_vaccinations)
  • @JamesWheeler,您的目标数据如何?
  • 回答 Roman 并为 @Kylie R 澄清。感谢 Simon 的回答,这就是我想要得到的答案: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)

标签: sql r dplyr tidyverse query-parser


【解决方案1】:

SQL 的PARTITION BY 方面通常可以使用group_by 在dplyr 中完成。

SQL 的ORDER BY 方面通常可以使用arrange 在dplyr 中完成。

考虑一下这个 R 代码:

library(dplyr)
data(mtcars)

mtcars %>%
  select(mpg, cyl) %>%
  group_by(cyl) %>%
  arrange(mpg) %>%
  mutate(new = cumsum(mpg)) %>%
  arrange(cyl, mpg) %>%
  select(cyl, mpg, new)

相当于这个SQL:

SELECT cyl
    ,mpg
    ,SUM(mpg) OVER (PARTITON BY cyl ORDER BY mpg) AS new
FROM mtcars

【讨论】:

  • 感谢西蒙。我在对原始问题的评论中回复了我用来解决问题的最终代码。如果我在移动到更大的数据集时遇到任何问题,您介意我按照您的方式发送它们吗?这很有帮助!
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2012-10-17
相关资源
最近更新 更多