You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言:按分组计算移动窗口标准差(面板数据场景)

按公司分组计算移动窗口标准差(R语言面板数据处理)

作为R语言新手,我最近在处理多公司月度股票收益的面板数据时卡壳了——我想给现有data.frame新增一列,展示按公司分组的最近3个观测值的移动窗口标准差,但尝试各种方法时总是弹出错误:replacement has X rows, data has Y(X远大于Y),完全不知道该怎么调整。

我的示例数据

先给大家看看简化后的测试数据:

company = c("1","1","1","1","1","2","2","2","2","2","2","2","3","3","3","3","4","4","4")
return = c(0.01,0.015,-0.01,0.02,0.023,-0.04,-0.02,-0.01,0.05,0.06,0.03,-0.09,0.2,0.3,-0.04,-0.02,-0.01,0.023,-0.04)
stock = data.frame(company,return)

预期效果

我想要新增一列std_3obs,具体规则如下:

  • 每个公司的前2个观测:因为不足3个数据,填充NA
  • 从第3个观测开始,计算当前行及之前2行的收益标准差:
    • 第3行(公司1的第3个数据):sd(c(0.01,0.015,-0.01)) = 0.01322876
    • 第8行(公司2的第3个数据):sd(c(-0.040,-0.020,-0.010)) = 0.01527525

最终解决方案(新手友好)

我后来找到一个简单的方法,用dplyr做分组,配合slider包处理滑动窗口计算,完美解决了行不匹配的问题:

步骤1:安装并加载所需包

如果还没安装过这两个包,先执行安装命令:

install.packages(c("dplyr", "slider"))
library(dplyr)
library(slider)

步骤2:分组计算移动窗口标准差

用一行代码就能完成需求:

stock <- stock %>%
  group_by(company) %>%  # 按公司分组,确保每个公司单独计算
  mutate(
    std_3obs = slide_dbl(
      return, 
      ~sd(.x), 
      .before = 2,  # 窗口包含当前行+前2行,共3个观测
      .complete = TRUE  # 只有窗口满3个数据才计算,否则返回NA
    )
  ) %>%
  ungroup()  # 取消分组,回到原始数据结构

验证结果

运行完这段代码后,查看stock数据,你会发现std_3obs列完全符合预期:

  • 每个公司的前两行都是NA
  • 从第3行开始,自动计算对应窗口的标准差,数值和预期完全一致

为什么之前会报错?

后来我想明白,之前的错误是因为没有按公司分组就直接计算滑动窗口,导致计算出的结果行数和原数据不匹配;或者手动循环时没处理好分组逻辑,把不同公司的数据混在一起计算了。用group_by()先分组,再用专门的滑动窗口函数,就能自动对齐每个公司的行数据,避免这类问题。

内容的提问来源于stack exchange,提问作者Michael Mü

火山引擎 最新活动