如何根据 r 中的年增长率向数据框添加新列?

how how to add new columns to a dataframe based on an annual growth rate in r?

我想将20个新列添加到具有年增长率的数据框中,即生成预测数据。这可能是一个简单的问题,但我是使用 r 的新手。我不知道是否有办法用循环或其他更简单的方法来做到这一点。期待您的支持。 我的数据是这样的数据框:

a <- c(1, 8, 10, 7)
b <- c("x1", "x2", "x3", "X4")
c <- c(10,20,30,40)
df <- data.frame(a,b,c)
d ```
considering a growth rate of 10% over column c, the expected result would be

   a  b  c  d    e     f   ...20 newcolumns 
1  1 x1 10 11  12.1  13.31 ...
2  8 x2 20 22  24.2  26.62 ...
3 10 x3 30 33  36.3  40.04 ...
4  7 X4 40 44  48.4  53.24 ...

实现所需结果的一种方法是使用矩阵和 for 循环,然后您可以将其转换为数据框并绑定到列 ab:

a <- c(1, 8, 10, 7)
b <- c("x1", "x2", "x3", "X4")
c <- c(10,20,30,40)

m <- matrix(NA, 4, 18)
for (i in seq(ncol(m))) {
  if (i == 1)
    m[, i] <- c
  else
    m[, i] <- 1.1 * m[, i-1]
}
m <- data.frame(m)
names(m) <- letters[3:20]

df <- data.frame(a,b)
df <- cbind(df, m)
df
#>    a  b  c  d    e     f      g       h        i        j        k        l
#> 1  1 x1 10 11 12.1 13.31 14.641 16.1051 17.71561 19.48717 21.43589 23.57948
#> 2  8 x2 20 22 24.2 26.62 29.282 32.2102 35.43122 38.97434 42.87178 47.15895
#> 3 10 x3 30 33 36.3 39.93 43.923 48.3153 53.14683 58.46151 64.30766 70.73843
#> 4  7 X4 40 44 48.4 53.24 58.564 64.4204 70.86244 77.94868 85.74355 94.31791
#>           m         n         o         p         q         r         s
#> 1  25.93742  28.53117  31.38428  34.52271  37.97498  41.77248  45.94973
#> 2  51.87485  57.06233  62.76857  69.04542  75.94997  83.54496  91.89946
#> 3  77.81227  85.59350  94.15285 103.56814 113.92495 125.31745 137.84919
#> 4 103.74970 114.12467 125.53714 138.09085 151.89993 167.08993 183.79892
#>          t
#> 1  50.5447
#> 2 101.0894
#> 3 151.6341
#> 4 202.1788

如果您想多次重复该过程,您可以使用如下函数 (R Version 4.1.0)

library(tidyverse)

a <- c(1, 8, 10, 7)
b <- c("x1", "x2", "x3", "X4")
c <- c(10,20,30,40)
df <- data.frame(a,b,c)


f <- function(df, rate = 10, ncols = 20) {
  rate <- 1 + rate / 100
  dft <- as_tibble(df)
  
  for (i in seq_len(ncols)) {
    dft <- dft |> mutate(dft[[ncol(dft)]] * rate)
    
    if (ncols < length(letters) - ncol(df)) {
      colnames(dft)[[length(dft)]] <- letters[[length(dft)]]
    }
  }
  
  dft
}
f(df, rate = 10, ncols = 20)
## # A tibble: 4 x 23
##       a b         c     d     e     f     g     h     i     j     k     l     m
##   <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     1 x1       10    11  12.1  13.3  14.6  16.1  17.7  19.5  21.4  23.6  25.9
## 2     8 x2       20    22  24.2  26.6  29.3  32.2  35.4  39.0  42.9  47.2  51.9
## 3    10 x3       30    33  36.3  39.9  43.9  48.3  53.1  58.5  64.3  70.7  77.8
## 4     7 X4       40    44  48.4  53.2  58.6  64.4  70.9  77.9  85.7  94.3 104. 
## # ... with 10 more variables: n <dbl>, o <dbl>, p <dbl>, q <dbl>, r <dbl>,
## #   s <dbl>, t <dbl>, u <dbl>, v <dbl>, w <dbl>