如何在R中将rollapply计算的首个非0roll_sd值替换为0?
将滚动标准差第一个非零值替换为0的实现方法
你可以在原有代码基础上新增一步处理,精准定位并替换目标值,完整代码如下:
library(tibble) library(dplyr) library(zoo) Data <- tibble( var = c("A", "A", "A", "A", "A","A"), val = c(1, 1, 1, 1, 1.5 , 1.5) )%>% # 保留原滚动标准差计算逻辑 mutate( roll_sd = rollapplyr(val, width = seq_len(n()), FUN = function(x) sd(x, na.rm = TRUE), fill = NA) ) %>% # 定位第一个非NA且非0的roll_sd,替换为0 mutate( roll_sd = case_when( row_number() == which(roll_sd != 0 & !is.na(roll_sd))[1] ~ 0, TRUE ~ roll_sd ) ) # 查看结果 Data
关键逻辑说明:
which(roll_sd != 0 & !is.na(roll_sd))[1]:筛选出所有非NA且不等于0的roll_sd行号,取第一个即为目标位置。case_when:仅对目标行的roll_sd赋值为0,其余行保持原有计算结果不变。
运行后输出将符合你的预期:
# A tibble: 6 × 3 var val roll_sd <chr> <dbl> <dbl> 1 A 1 NA 2 A 1 0 3 A 1 0 4 A 1 0 5 A 1.5 0 6 A 1.5 0.258
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

