You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:32:38