【问题标题】:how how to add new columns to a dataframe based on an annual growth rate in r?如何根据 r 的年增长率将新列添加到数据框中?
【发布时间】:2021-06-24 20:21:02
【问题描述】:

我想在一个具有年增长率的数据框中添加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 ...

【问题讨论】:

    标签: r dataframe loops calculated-columns


    【解决方案1】:

    如果您想多次重复该过程,您可以使用如下函数 (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>
    

    【讨论】:

    • 嗨@Mwavu,也许我没有指定它是我的错误,但是前两列的名称不是a和b,也就是说,它们不是字母,也许这就是我运行时的原因我真实数据框中的代码不起作用
    • 确保您希望按年增长率增长的列是实际 data.frame 中的最后一个。应该工作。
    【解决方案2】:

    实现所需结果的一种方法是使用矩阵和for-loop,然后您可以将其转换为数据框并绑定到您的列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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      相关资源
      最近更新 更多