R 有效地将增长率应用于初始值,以在多年内实现不同的增长率

R 有效地将增长率应用于初始值,以在多年内实现不同的增长率,r,dplyr,R,Dplyr,我有一个未来增长率的大数据集和每个人的初始值 我想把t=0时的增长率乘以初始值t=0,得到t=1时的值。这个t=1的值,我想乘以t=1时的增长率,以此类推 我目前是通过循环来实现的,但是考虑到我有很多人在很长的一段时间内,这是非常缓慢的,我觉得一定有一种更聪明、更优雅的方式来实现这一点 我特别想使用dplyr函数来实现这一点 #Create a sample df df <- data.frame(id=rep(c("A","B"),each=5), year=rep

我有一个未来增长率的大数据集和每个人的初始值

我想把t=0时的增长率乘以初始值t=0,得到t=1时的值。这个t=1的值,我想乘以t=1时的增长率,以此类推

我目前是通过循环来实现的,但是考虑到我有很多人在很长的一段时间内,这是非常缓慢的,我觉得一定有一种更聪明、更优雅的方式来实现这一点

我特别想使用dplyr函数来实现这一点

#Create a sample df
df <- data.frame(id=rep(c("A","B"),each=5),
           year=rep(1:5,2),
           value = NA)

set.seed(123)
growth_rates <- data.frame(id=rep(c("A","B"),each=5),
                           year=rep(1:5,2),
                           value = runif(10,0.95,1.1))

# pick an initial value (in reality this is given)
df[df$year==1&df$id=="A","value"] <- 5
df[df$year==1&df$id=="B","value"] <- 7

for (i in 2:5){
  df[df$year == i,"value"] <- df[df$year == i-1,"value"]*growth_rates[growth_rates$year == i-1,"value"]
}

谢谢你的帮助

这里有一个简洁的dplyr解决方案,使用增长率的滞后:

初始值% 组\按ID%>% mutatecumulative=lagcumprodvalue,默认值=1%>% mutatevalue=累计*初始值[匹配ID,cA,B]]>% 选择累积 >一个tibble:10x3 >组别:id[2] >id年份值 > >1A 15 >2 A 2 4.97 >3 A 35.30 >4 A 4 5.36 >5 A 5.81 >6b17 >7 B 2 6.70 >8 B 3 6.89 >9 B 4 7.47 >10 B 5 7.72
这里有一个简洁的dplyr解决方案,它使用了增长率的滞后:

初始值% 组\按ID%>% mutatecumulative=lagcumprodvalue,默认值=1%>% mutatevalue=累计*初始值[匹配ID,cA,B]]>% 选择累积 >一个tibble:10x3 >组别:id[2] >id年份值 > >1A 15 >2 A 2 4.97 >3 A 35.30 >4 A 4 5.36 >5 A 5.81 >6b17 >7 B 2 6.70 >8 B 3 6.89 >9 B 4 7.47 >10 B 5 7.72 在分配每组的初始值后,我们可以使用累积自purrr

library(dplyr)
library(purrr)

initial_value <- c(5, 7)
growth_rates$ans[!duplicated(df$id)] <- initial_value


growth_rates %>%
   group_by(id) %>%
   mutate(ans = accumulate(value[-n()], `*`, .init = first(ans)))


#   id     year value   ans
#   <fct> <int> <dbl> <dbl>
# 1 A         1 0.993  5   
# 2 A         2 1.07   4.97
# 3 A         3 1.01   5.30
# 4 A         4 1.08   5.36
# 5 A         5 1.09   5.81
# 6 B         1 0.957  7   
# 7 B         2 1.03   6.70
# 8 B         3 1.08   6.89
# 9 B         4 1.03   7.47
#10 B         5 1.02   7.72
在分配每组的初始值后,我们可以使用累积自purrr

library(dplyr)
library(purrr)

initial_value <- c(5, 7)
growth_rates$ans[!duplicated(df$id)] <- initial_value


growth_rates %>%
   group_by(id) %>%
   mutate(ans = accumulate(value[-n()], `*`, .init = first(ans)))


#   id     year value   ans
#   <fct> <int> <dbl> <dbl>
# 1 A         1 0.993  5   
# 2 A         2 1.07   4.97
# 3 A         3 1.01   5.30
# 4 A         4 1.08   5.36
# 5 A         5 1.09   5.81
# 6 B         1 0.957  7   
# 7 B         2 1.03   6.70
# 8 B         3 1.08   6.89
# 9 B         4 1.03   7.47
#10 B         5 1.02   7.72