我有以下数据:
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,等等。
发布于 2022-05-09 18:23:38
当你的一系列日期不连续的时候,折叠式也会起作用。
它将计算每个日期与第一个日期的差异,以星期为单位。打滚,然后使用这个数字,作为1.05的幂。
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
...发布于 2022-05-09 18:30:50
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发布于 2022-05-09 18:49:16
下面是使用dplyr的另一个选项(逻辑类似@Wimpel的答案),本质上我们可以使用gl创建一系列的周,然后将功率提高到1.05。然而,这假设数据是连续的。
library(dplyr)
mydf %>%
mutate(value = value* 1.05^(as.integer(gl(n(), 7, n()))-1))输出
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。
mydf %>%
mutate(value = value* 1.05^(cut.Date(date, breaks = "1 week", labels = FALSE)-1))输出
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.8125https://stackoverflow.com/questions/72176551
复制相似问题