将列中的值与 R 中的日期范围相乘
Multiply values within a column with a date range in R
我是论坛的新手,希望问题是可以理解的。
我有一个数据框(df)如下
id date announcement_date ret
12055 2001-08-02 2001-08-03 1.0246
12055 2001-08-03 2001-08-03 1.123
12055 2001-08-04 2001-08-03 0.994
11033 2001-08-02 2001-08-05 1.020
11033 2001-08-03 2001-08-05 0.997
11033 2001-08-04 2001-08-05 0.949
11033 2001-08-05 2001-08-05 1.048
11033 2001-08-06 2001-08-05 1.060
11033 2001-08-07 2001-08-05 1.002
如何创建一个新列,其中包含从 announcement_date 到最后一天的按 ID 分组的 'ret' 的乘积?也就是说,对于 id=11033,我想创建一个新列“Product”,如下所示:
id date announcement_date ret Product
11033 2001-08-02 2001-08-05 1.020 -
11033 2001-08-03 2001-08-05 0.997 -
11033 2001-08-04 2001-08-05 0.949 -
11033 2001-08-05 2001-08-05 1.048 1.048
11033 2001-08-06 2001-08-05 1.060 1.048*1.060
11033 2001-08-07 2001-08-05 1.002 1.048*1.060*1.002
我试过代码
df$product <- aggregate(ret ~ id + ret, df, prod)
可行,但我得到了所有日期中每个 'id' 的 'ret' 的乘积,即我不知道如何将 'starting date' 设置为 announcement_date .
这个有用吗:
library(purrr)
library(dplyr)
df %>% group_by(id) %>% filter(date>=announcement_date) %>%
mutate(Product = accumulate(ret, `*`)) %>% as.data.frame() %>% right_join(df) %>%
arrange(desc(id), date)
Joining, by = c("id", "date", "announcement_date", "ret")
id date announcement_date ret Product
1 12055 2001-08-02 2001-08-03 1.0246 NA
2 12055 2001-08-03 2001-08-03 1.1230 1.123000
3 12055 2001-08-04 2001-08-03 0.9940 1.116262
4 11033 2001-08-02 2001-08-05 1.0200 NA
5 11033 2001-08-03 2001-08-05 0.9970 NA
6 11033 2001-08-04 2001-08-05 0.9490 NA
7 11033 2001-08-05 2001-08-05 1.0480 1.048000
8 11033 2001-08-06 2001-08-05 1.0600 1.110880
9 11033 2001-08-07 2001-08-05 1.0020 1.113102
我是论坛的新手,希望问题是可以理解的。
我有一个数据框(df)如下
id date announcement_date ret
12055 2001-08-02 2001-08-03 1.0246
12055 2001-08-03 2001-08-03 1.123
12055 2001-08-04 2001-08-03 0.994
11033 2001-08-02 2001-08-05 1.020
11033 2001-08-03 2001-08-05 0.997
11033 2001-08-04 2001-08-05 0.949
11033 2001-08-05 2001-08-05 1.048
11033 2001-08-06 2001-08-05 1.060
11033 2001-08-07 2001-08-05 1.002
如何创建一个新列,其中包含从 announcement_date 到最后一天的按 ID 分组的 'ret' 的乘积?也就是说,对于 id=11033,我想创建一个新列“Product”,如下所示:
id date announcement_date ret Product
11033 2001-08-02 2001-08-05 1.020 -
11033 2001-08-03 2001-08-05 0.997 -
11033 2001-08-04 2001-08-05 0.949 -
11033 2001-08-05 2001-08-05 1.048 1.048
11033 2001-08-06 2001-08-05 1.060 1.048*1.060
11033 2001-08-07 2001-08-05 1.002 1.048*1.060*1.002
我试过代码
df$product <- aggregate(ret ~ id + ret, df, prod)
可行,但我得到了所有日期中每个 'id' 的 'ret' 的乘积,即我不知道如何将 'starting date' 设置为 announcement_date .
这个有用吗:
library(purrr)
library(dplyr)
df %>% group_by(id) %>% filter(date>=announcement_date) %>%
mutate(Product = accumulate(ret, `*`)) %>% as.data.frame() %>% right_join(df) %>%
arrange(desc(id), date)
Joining, by = c("id", "date", "announcement_date", "ret")
id date announcement_date ret Product
1 12055 2001-08-02 2001-08-03 1.0246 NA
2 12055 2001-08-03 2001-08-03 1.1230 1.123000
3 12055 2001-08-04 2001-08-03 0.9940 1.116262
4 11033 2001-08-02 2001-08-05 1.0200 NA
5 11033 2001-08-03 2001-08-05 0.9970 NA
6 11033 2001-08-04 2001-08-05 0.9490 NA
7 11033 2001-08-05 2001-08-05 1.0480 1.048000
8 11033 2001-08-06 2001-08-05 1.0600 1.110880
9 11033 2001-08-07 2001-08-05 1.0020 1.113102