我有一个数据框:
> df
date group return
1 197501 A 1.020
2 197502 A 1.050
3 197503 A 1.031
4 197504 A 0.970
5 197501 B 0.990
6 197502 B 1.023
7 197503 B 1.040
8 197504 B 1.050
我想创建一个新的“inv”列来表示我的投资增长,即我在 197501 投资了 1,000,000,然后我需要计算我的投资回报(加上上个月的回报)。此外,我有组意味着每次新组开始时第一行应该从 1,000,000 * return 开始。
这意味着:
在第 1 行,我想要
1,000,000 * 1.020 = 1,020,000
在第 2 行我想要
1,020,000 * 1.050 = 1,071,000
等
在第 5 行(b 组)我想要
1,000,000 * 0.990 = 990,000
在第 6 排(b 组)我想要
990,000 * 1.023 = 1,012,770
等
最终结果应该是这样的:
date group return inv
1 197501 A 1.020 1020000.00
2 197502 A 1.050 1071000.00
3 197503 A 1.031 1104201.00
4 197504 A 0.970 1071075.97
5 197501 B 0.990 990000.00
6 197502 B 1.023 1012770.00
7 197503 B 1.040 1053281.80
8 197504 B 1.050 1105945.84
如何在 R 中执行此操作?
答案 0 :(得分:0)
我们可以在进行group by操作后使用cumprod
library(dplyr)
df1 <- df %>%
group_by(group) %>%
mutate(inv = 1000000 *cumprod(return)) %>%
ungroup
-输出
df1
# A tibble: 8 x 4
# date group return inv
# <int> <chr> <dbl> <dbl>
#1 197501 A 1.02 1020000
#2 197502 A 1.05 1071000.
#3 197503 A 1.03 1104201
#4 197504 A 0.97 1071075.
#5 197501 B 0.99 990000
#6 197502 B 1.02 1012770
#7 197503 B 1.04 1053281.
#8 197504 B 1.05 1105945.
或者使用 base R
df$inv <- with(df, 1000000 * ave(return, group, FUN = cumprod))
df <- structure(list(date = c(197501L, 197502L, 197503L, 197504L, 197501L,
197502L, 197503L, 197504L), group = c("A", "A", "A", "A", "B",
"B", "B", "B"), return = c(1.02, 1.05, 1.031, 0.97, 0.99, 1.023,
1.04, 1.05)), class = "data.frame", row.names = c("1", "2", "3",
"4", "5", "6", "7", "8"))