将xts格式虚拟变量表按行转换为行和为1的均匀权重的实现方法
解决方案
你需要的核心逻辑是按行统计1的个数,再将该行所有1替换为1/个数,以下是两种可直接运行的R实现:
前置准备:构造示例xts数据
library(xts) # 示例数据与你给出的结构完全一致 raw_data <- xts( matrix( c(1, NA, 1, 1, NA, 1, NA, 1, NA, 1, 1, 1, 1, NA), nrow = 2, byrow = TRUE, dimnames = list(NULL, c("NESN", "ROG", "NOVN", "ZURN", "ABBN", "UBSG", "LONN")) ), order.by = as.Date(c("1989-12-01", "1990-01-01")) )
方法1:apply按行处理(可读性强,适合小数据集)
直接按行遍历,每行单独计算权重:
# 按行处理,每行所有元素除以该行1的总个数 weight_data <- t(apply(raw_data, 1, function(row) { n <- sum(row, na.rm = TRUE) row / n })) # 转回xts格式保留时间索引 weight_data <- as.xts(weight_data)
方法2:向量化运算(速度快,适合大规模数据集)
利用矩阵运算避免循环,处理万行以上的xts数据时效率提升明显:
# 先统计每行1的总个数 row_n <- rowSums(raw_data, na.rm = TRUE) # 转置后做除法再转回,保证按行广播运算 weight_data <- as.xts(t(t(raw_data) / row_n))
两种方法得到的结果完全符合你给出的目标格式,NA值会自动保留不需要额外处理,得到的权重矩阵可直接用于后续投资组合换手率计算。
内容的提问来源于stack exchange,提问作者Elias K.
相关产品推荐
相关产品推荐

