R语言按行计算月度股票beta中位数 划分高低beta投资组合
R实现按月份beta中位数划分高低beta投资组合
原代码运行异常原因
- 仅将字符型"N/A"替换为标准NA值,未将存储beta的字符列转换为数值类型,不满足中位数计算的数值类型要求
rowwise()场景下直接传入across()的返回值给median():across()返回的是子数据框结构,不是一维数值向量,无法正确计算中位数- 宽表结构下逐股票标记组合归属逻辑繁琐,长宽转换后分组操作更简洁
可直接运行的修正代码
library(dplyr) library(tidyr) OMXCB_result <- OMXCB_END %>% # 预处理:替换缺失值+统一转数值类型 mutate(across(where(is.character), ~na_if(., "N/A") %>% as.numeric())) %>% # 按行(单月维度)计算当月全市场beta中位数 rowwise() %>% mutate(monthly_median_beta = median(c_across(-Names), na.rm = TRUE)) %>% ungroup() %>% # 宽表转长表,每行对应「月份-单只股票」的单条观测 pivot_longer( cols = -c(Names, monthly_median_beta), names_to = "stock_id", values_to = "beta" ) %>% # 按规则划分组合 mutate( portfolio = case_when( beta >= monthly_median_beta ~ "高beta组合", beta < monthly_median_beta ~ "低beta组合", TRUE ~ NA_character_ ) )
关键逻辑说明
- 行级计算用
c_across()替代across():该函数专为rowwise()场景设计,会将选中的行内值拼接为一维向量,可直接传入统计函数计算 - 中位数计算自动忽略beta值缺失的股票,beta为NA的样本不会被划入任何组合
- 长表结构可直接支持后续分组统计:需要计算组合月度收益、做组合回测时,直接按
Names(月份)+portfolio分组聚合即可 - 代码完全适配提供的样例数据结构:
Names列为月份标识,其余每列对应单只股票的beta序列

内容的提问来源于stack exchange,提问作者Jinoor Sellathurai
相关产品推荐
相关产品推荐

