首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向前推进最后一次观察(na.locf?) --但仅当另一列值发生更改时

向前推进最后一次观察(na.locf?) --但仅当另一列值发生更改时
EN

Stack Overflow用户
提问于 2022-01-24 16:08:44
回答 1查看 61关注 0票数 2

背景:我观察不同ISIN码中权重的组合。在每月的基础上,我可以观察每个ISIN代码中的权重是如何变化的。权数的变化总是一个月的最后一次观察。

目标:我的目标是在每天的基础上跨越每月的权重。因此,我在一个月底的观察必须继续下去,并在下个月的所有日常观察中扩展--直到观察到一个新的重量。

--我遇到了一个小问题,:最大的问题是,我不能只使用"na.locf“--因为有时候一个ISIN会卖光投资组合,因此权重变成0。因此,为了克服困难,我试图创建一个“帮助专栏”,以实现我的目标。本专栏只跟踪我们所处的年份和月份。在下面的代码中,这个助手列被称为"ym“。

可复制代码:

代码语言:javascript
复制
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的新权重必须继续下去,直到新的权重出现为止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-24 16:18:34

您可以使用fill

代码语言:javascript
复制
df %>% 
  mutate(sum = rowSums(!is.na(select(., DK0004612884:DK0002025170))),
         across(DK0004612884:DK0002025170, ~ case_when(sum > 0 ~ replace_na(.x, 0)))) %>% 
  fill(DK0004612884:DK0002025170)

输出

代码语言:javascript
复制
         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   0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70836869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档