我遇到了以下问题:我得到了一个数据库,必须对一些Delta进行评估,例如,我已经用SQL计算了这个问题,它运行得很好,但是现在我需要用R来尝试它,而且我对R不太好,所以我不太确定我的问题是否可以用R来解决。最好的情况是,如果我能够将我的sql代码转换成R代码。否则我会向你提出我的问题:
+----+------+------------+
| a | b | c |
+----+------+------------+
| 10 | 2 | 31.01.2020 |
| 11 | 5 | 31.01.2020 |
| 10 | 3 | 31.01.2020 |
| 10 | 2 | 31.12.2019 |
| 11 | 4 | 31.12.2019 |
| 10 | 2 | 31.12.2019 |
+----+------+------------+dput:
structure(list(a = c(10L, 11L, 10L, 10L, 11L, 10L), b = c(2L,
5L, 3L, 2L, 4L, 2L), c = c("31.01.2020", "31.01.2020", "31.01.2020",
"31.12.2019", "31.12.2019", "31.12.2019")), row.names = c(NA,
-6L), class = "data.frame")三角洲
+----+---+
| 10 | 1 |
| 11 | 1 |
+----+---+这是我第一次在这个社区,所以我希望你能看到我的照片。这是我问题的一个例子:
在第一步中,我需要对同一日期(c)和a中相同编号的B栏进行总结。因此,2020年12月31日的结果将是: 10= 5和11= 5,而2019年12月31日相同。
在此之前,它可以工作,但在下一步中,我需要计算b) s.t的增量。( a)和( c)栏)
换句话说,对于a中的数字10,我在2019年12月31日计算了31.01.2020年的5次,我计算了10次,现在我不得不计算5-4,但我不可能对它进行编程。
因此,我希望你们中的一些人能理解我的问题,并能帮助我找到一个聪明的方法,我可以解决这个问题。
如果你能帮我,我会非常感激的。
发布于 2020-04-09 13:15:48
您可以使用data.table来完成这个任务。首先将c转换为日期列。
然后根据每个b组取(a, c)之和,然后在结果表的a组中,取该和的diff。diff将朝着正确的方向前进,因为keyby按分组列排序结果。
library(data.table)
setDT(df)
df[, c := as.Date(c, format = '%d.%m.%Y')]
df[, .(bsum = sum(b)), keyby = .(a, c)
][, .(bsum_diff = diff(bsum)), by = a]
# a bsum_diff
# 1: 10 1
# 2: 11 1发布于 2020-04-09 13:30:19
使用包dplyr,尝试如下所示:
library(dplyr)
df %>%
mutate(c_date = as.Date(c, format = "%d.%m.%Y")) %>% # convert to a Date in R
group_by(a, c_date) %>%
summarize(b = sum(b)) %>% # sum grouped by a and c
group_by(a) %>%
arrange(c_date) %>% # sort on the date
summarize(delta = diff(b)) # take the difference, grouped on a这将使:
# A tibble: 2 x 2
a delta
<int> <int>
1 10 1
2 11 1发布于 2020-04-09 13:13:31
我不知道是否可以将SQL转换成R代码,但是通过R处理数据库并不困难。从总体上看:您需要设置一个SQL连接: DBI::dbconnect()。接下来,使用函数tbl()和包dplyr开始复制select语句。在这里您可以找到更多信息:https://db.rstudio.com
https://stackoverflow.com/questions/61121513
复制相似问题