将虚拟变量转换为权重

问题描述

我有一个虚拟变量表,其中的值为 1 或 NA。我知道想要为这些假人跨行创建统一的权重。这是我的开始数据集,它是 xts 格式:

           nesN ROG NOVN ZURN ABBN UBSG LONN
1989-12-01   1   NA   1   1    NA   1    NA
1990-01-01   1   NA   1   1    1    1    NA

然后我想拆分 1,使行的总和等于 1。结束数据集将如下所示:

            nesN ROG NOVN ZURN ABBN UBSG LONN
1989-12-01  0.25 NA  0.25 0.25 NA   0.25  NA
1990-01-01  0.2  NA  0.2  0.2  0.2  0.2   NA

因此,如果整行中有 5 只股票的虚拟值等于 1,则 1 将更改为 0.2。如果有 4 只股票,它将更改为 0.25,依此类推。到目前为止,我正在考虑使用 replace 来替换 1 与它们各自的重量。但是,我不知道如何在具有不同权重的多行上执行此操作。我这样做是为了最终计算投资组合周转率。

解决方法

您可以按行数划分数据框。

# data structure
df <- structure(list(NESN = c(1L,1L),ROG = c(NA,NA),NOVN = c(1L,ZURN = c(1L,ABBN = c(NA,UBSG = c(1L,LONN = c(NA,NA)),class = "data.frame",row.names = c("1989-12-01","1990-01-01"
))

# solution
df/rowSums(df,na.rm=T)
#           NESN ROG NOVN ZURN ABBN UBSG LONN
#1989-12-01 0.25  NA 0.25 0.25   NA 0.25   NA
#1990-01-01 0.20  NA 0.20 0.20  0.2 0.20   NA
,

您可以使用 apply rowwise 和 transpose:

df <- data.frame(NESN = c(1,1),NOVN = c(1,ZURN = c(1,UBSG = c(1,NA))

t(apply(df,1,function(x){x/sum(x,na.rm = TRUE)}))

     NESN ROG NOVN ZURN ABBN UBSG LONN
[1,] 0.25  NA 0.25 0.25   NA 0.25   NA
[2,] 0.20  NA 0.20 0.20  0.2 0.20   NA

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...