背景:我观察不同ISIN码中权重的组合。在每月的基础上,我可以观察每个ISIN代码中的权重是如何变化的。权数的变化总是一个月的最后一次观察。
目标:我的目标是在每天的基础上跨越每月的权重。因此,我在一个月底的观察必须继续下去,并在下个月的所有日常观察中扩展--直到观察到一个新的重量。
--我遇到了一个小问题,:最大的问题是,我不能只使用"na.locf“--因为有时候一个ISIN会卖光投资组合,因此权重变成0。因此,为了克服困难,我试图创建一个“帮助专栏”,以实现我的目标。本专栏只跟踪我们所处的年份和月份。在下面的代码中,这个助手列被称为"ym“。
可复制代码:
df = data.frame(
Date = as.POSIXlt(c("29-01-2021" , "01-02-2021", "02-02-2021", "03-02-2021", "04-02-2021", "05-02-2021",
"08-02-2021", "09-02-2021", "10-02-2021" , "11-02-2021", "12-02-2021" , "15-02-2021",
"16-02-2021", "17-02-2021", "18-02-2021", "19-02-2021", "22-02-2021", "23-02-2021",
"24-02-2021", "25-02-2021", "26-02-2021" , "01-03-2021", "02-03-2021", "03-03-2021",
"04-03-2021", "05-03-2021", "08-03-2021" , "09-03-2021", "10-03-2021", "11-03-2021", "12-03-2021"), format = "%d-%m-%Y"),
DK0004612884 = c(14.48, NA, NA, NA, NA,NA, NA,NA, NA,NA, NA,NA, NA,NA,
NA,NA, NA,NA, NA,NA, 14.15,NA, NA,NA, NA, NA, NA, NA, NA, NA, NA),
DK0002025170 = c(0.58, NA, NA, NA, NA,NA, NA,NA, NA,NA, NA,NA, NA,NA,
NA,NA, NA,NA, NA,NA, NA ,NA, NA,NA, NA, NA, NA, NA, NA, NA, NA)
)
df$ym = paste0(year(df$Date), "-", month(df$Date))
print.data.frame(df)
Date DK0004612884 DK0002025170 ym
1 2021-01-29 14.48 0.58 2021-1
2 2021-02-01 NA NA 2021-2
3 2021-02-02 NA NA 2021-2
4 2021-02-03 NA NA 2021-2
5 2021-02-04 NA NA 2021-2
6 2021-02-05 NA NA 2021-2
7 2021-02-08 NA NA 2021-2
8 2021-02-09 NA NA 2021-2
9 2021-02-10 NA NA 2021-2
10 2021-02-11 NA NA 2021-2
11 2021-02-12 NA NA 2021-2
12 2021-02-15 NA NA 2021-2
13 2021-02-16 NA NA 2021-2
14 2021-02-17 NA NA 2021-2
15 2021-02-18 NA NA 2021-2
16 2021-02-19 NA NA 2021-2
17 2021-02-22 NA NA 2021-2
18 2021-02-23 NA NA 2021-2
19 2021-02-24 NA NA 2021-2
20 2021-02-25 NA NA 2021-2
21 2021-02-26 14.15 NA 2021-2
22 2021-03-01 NA NA 2021-3
23 2021-03-02 NA NA 2021-3
24 2021-03-03 NA NA 2021-3
25 2021-03-04 NA NA 2021-3
26 2021-03-05 NA NA 2021-3
27 2021-03-08 NA NA 2021-3
28 2021-03-09 NA NA 2021-3
29 2021-03-10 NA NA 2021-3
30 2021-03-11 NA NA 2021-3
31 2021-03-12 NA NA 2021-3见以下:从2021-01-29到2021-02-26,14.48和0.58的观测必须继续到日期:"2021-02-26“。在这里,两个ISIN的重量都发生了变化。但是,看看我把DK0002025170 ISIN卖光了。因此,从这里开始的每个值(直到看到潜在的新权重)都必须是0。而属于DK0004612884的14.15的新权重必须继续下去,直到新的权重出现为止。
发布于 2022-01-24 16:18:34
您可以使用fill
df %>%
mutate(sum = rowSums(!is.na(select(., DK0004612884:DK0002025170))),
across(DK0004612884:DK0002025170, ~ case_when(sum > 0 ~ replace_na(.x, 0)))) %>%
fill(DK0004612884:DK0002025170)输出
Date DK0004612884 DK0002025170 ym sum
1 2021-01-29 14.48 0.58 2021-1 2
2 2021-02-01 14.48 0.58 2021-2 0
3 2021-02-02 14.48 0.58 2021-2 0
4 2021-02-03 14.48 0.58 2021-2 0
5 2021-02-04 14.48 0.58 2021-2 0
6 2021-02-05 14.48 0.58 2021-2 0
7 2021-02-08 14.48 0.58 2021-2 0
8 2021-02-09 14.48 0.58 2021-2 0
9 2021-02-10 14.48 0.58 2021-2 0
10 2021-02-11 14.48 0.58 2021-2 0
11 2021-02-12 14.48 0.58 2021-2 0
12 2021-02-15 14.48 0.58 2021-2 0
13 2021-02-16 14.48 0.58 2021-2 0
14 2021-02-17 14.48 0.58 2021-2 0
15 2021-02-18 14.48 0.58 2021-2 0
16 2021-02-19 14.48 0.58 2021-2 0
17 2021-02-22 14.48 0.58 2021-2 0
18 2021-02-23 14.48 0.58 2021-2 0
19 2021-02-24 14.48 0.58 2021-2 0
20 2021-02-25 14.48 0.58 2021-2 0
21 2021-02-26 14.15 0.00 2021-2 1
22 2021-03-01 14.15 0.00 2021-3 0
23 2021-03-02 14.15 0.00 2021-3 0
24 2021-03-03 14.15 0.00 2021-3 0
25 2021-03-04 14.15 0.00 2021-3 0
26 2021-03-05 14.15 0.00 2021-3 0
27 2021-03-08 14.15 0.00 2021-3 0
28 2021-03-09 14.15 0.00 2021-3 0
29 2021-03-10 14.15 0.00 2021-3 0
30 2021-03-11 14.15 0.00 2021-3 0
31 2021-03-12 14.15 0.00 2021-3 0https://stackoverflow.com/questions/70836869
复制相似问题