如何根据 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
循环,然后您可以将其转换为数据框并绑定到列 a
和 b
:
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>
我想将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
循环,然后您可以将其转换为数据框并绑定到列 a
和 b
:
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>