将虚拟变量转化为权重
Turn dummy variables into weights
我有一个 table 虚拟变量,其中的值为 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
因此,如果整行中有五只股票的虚拟变量等于 1,则 1 将更改为 0.2。如果有 4 只股票,它将更改为 0.25,依此类推。到目前为止,我一直在考虑使用 replace 将 1 替换为各自的权重。但是,我不知道如何对具有不同权重的多行执行此操作。我这样做是为了最终计算投资组合周转率。
您可以使用按行应用和转置:
df <- data.frame(NESN = c(1,1), ROG = c(NA,NA), NOVN = c(1,1),
ZURN = c(1,1), ABBN = c(NA,1), UBSG = c(1,1),
LONN = c(NA,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
您可以将数据框除以其行总和。
# data structure
df <- structure(list(NESN = c(1L, 1L), ROG = c(NA, NA), NOVN = c(1L,
1L), ZURN = c(1L, 1L), ABBN = c(NA, 1L), UBSG = c(1L, 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
我有一个 table 虚拟变量,其中的值为 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
因此,如果整行中有五只股票的虚拟变量等于 1,则 1 将更改为 0.2。如果有 4 只股票,它将更改为 0.25,依此类推。到目前为止,我一直在考虑使用 replace 将 1 替换为各自的权重。但是,我不知道如何对具有不同权重的多行执行此操作。我这样做是为了最终计算投资组合周转率。
您可以使用按行应用和转置:
df <- data.frame(NESN = c(1,1), ROG = c(NA,NA), NOVN = c(1,1),
ZURN = c(1,1), ABBN = c(NA,1), UBSG = c(1,1),
LONN = c(NA,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
您可以将数据框除以其行总和。
# data structure
df <- structure(list(NESN = c(1L, 1L), ROG = c(NA, NA), NOVN = c(1L,
1L), ZURN = c(1L, 1L), ABBN = c(NA, 1L), UBSG = c(1L, 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