首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中每周增加5%的变量

在R中每周增加5%的变量
EN

Stack Overflow用户
提问于 2022-05-09 18:18:55
回答 3查看 27关注 0票数 1

我有以下数据:

代码语言:javascript
复制
date <- seq.Date(from = as.Date("2022-01-01"), to = as.Date("2022-07-01"), by = "day")
value <- rep(500, length(date))
mydf <- cbind.data.frame(date, deliveries)

我希望每周将我的值变量增加5%,即mydf$1:7保持不变,mydf$8:14变为500*(1.05) = 525,mydf$值15:21变为525*(1.05) = 551.25,等等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-09 18:23:38

当你的一系列日期不连续的时候,折叠式也会起作用。

它将计算每个日期与第一个日期的差异,以星期为单位。打滚,然后使用这个数字,作为1.05的幂。

代码语言:javascript
复制
mydf$newValue <- value * 1.05^(as.numeric(floor(difftime(mydf$date, mydf$date[1], units = "weeks"))))

          date value  newValue
1   2022-01-01   500  500.0000
2   2022-01-02   500  500.0000
3   2022-01-03   500  500.0000
4   2022-01-04   500  500.0000
5   2022-01-05   500  500.0000
6   2022-01-06   500  500.0000
7   2022-01-07   500  500.0000
8   2022-01-08   500  525.0000
9   2022-01-09   500  525.0000
10  2022-01-10   500  525.0000
11  2022-01-11   500  525.0000
12  2022-01-12   500  525.0000
13  2022-01-13   500  525.0000
14  2022-01-14   500  525.0000
15  2022-01-15   500  551.2500
16  2022-01-16   500  551.2500
17  2022-01-17   500  551.2500
18  2022-01-18   500  551.2500
19  2022-01-19   500  551.2500
20  2022-01-20   500  551.2500
21  2022-01-21   500  551.2500
22  2022-01-22   500  578.8125
23  2022-01-23   500  578.8125
24  2022-01-24   500  578.8125
25  2022-01-25   500  578.8125
26  2022-01-26   500  578.8125
27  2022-01-27   500  578.8125
28  2022-01-28   500  578.8125
29  2022-01-29   500  607.7531
...
票数 1
EN

Stack Overflow用户

发布于 2022-05-09 18:30:50

代码语言:javascript
复制
date <- seq.Date(from = as.Date("2022-01-01"), to = as.Date("2022-07-01"), by = "day")
value <- rep(500, length(date))
mydf <- cbind.data.frame(date, value)
mydf$value_updated <- c(rep(500,times=7), 500 + rep(cumsum(rep(500, (length(date)-7)/7)*.05), each = 7))
rbind(head(mydf), tail(mydf))
          date value value_updated
1   2022-01-01   500           500
2   2022-01-02   500           500
3   2022-01-03   500           500
4   2022-01-04   500           500
5   2022-01-05   500           500
6   2022-01-06   500           500
177 2022-06-26   500          1125
178 2022-06-27   500          1125
179 2022-06-28   500          1125
180 2022-06-29   500          1125
181 2022-06-30   500          1125
182 2022-07-01   500          1125
票数 0
EN

Stack Overflow用户

发布于 2022-05-09 18:49:16

下面是使用dplyr的另一个选项(逻辑类似@Wimpel的答案),本质上我们可以使用gl创建一系列的周,然后将功率提高到1.05。然而,这假设数据是连续的。

代码语言:javascript
复制
library(dplyr)

mydf %>%
  mutate(value = value* 1.05^(as.integer(gl(n(), 7, n()))-1))

输出

代码语言:javascript
复制
          date     value
1   2022-01-01  500.0000
2   2022-01-02  500.0000
3   2022-01-03  500.0000
4   2022-01-04  500.0000
5   2022-01-05  500.0000
6   2022-01-06  500.0000
7   2022-01-07  500.0000
8   2022-01-08  525.0000
9   2022-01-09  525.0000

另一个选项,如果您希望在某个日期所在的实际周中分组,则可以使用cut.Date

代码语言:javascript
复制
mydf %>%
  mutate(value = value* 1.05^(cut.Date(date, breaks = "1 week", labels = FALSE)-1))

输出

代码语言:javascript
复制
          date     value
1   2022-01-01  500.0000
2   2022-01-02  500.0000
3   2022-01-03  525.0000
4   2022-01-04  525.0000
5   2022-01-05  525.0000
6   2022-01-06  525.0000
7   2022-01-07  525.0000
8   2022-01-08  525.0000
9   2022-01-09  525.0000
10  2022-01-10  551.2500
11  2022-01-11  551.2500
12  2022-01-12  551.2500
13  2022-01-13  551.2500
14  2022-01-14  551.2500
15  2022-01-15  551.2500
16  2022-01-16  551.2500
17  2022-01-17  578.8125
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72176551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档