在R语言中为数据框添加MSCI.ESG.Rating对应层级列的问题
解决MSCI ESG评级映射层级的问题
先给你修正后的可运行代码,解决评级映射和新列生成的问题:
# 提取目标列 sub <- subset(fsdf, select = c(BBG_Ticker, MSCI.ESG.Rating, esg)) # 去除评级文本前后的空格 sub$MSCI.ESG.Rating <- sub$MSCI.ESG.Rating %>% trimws(which = "both") # 定义评级到层级的映射表(修正原代码中同一个评级对应多个层级的冲突) rating_map <- c( "AAA" = 5, "A" = 4, "BBB" = 3, "BB" = 2, "B" = 1, "CCC" = 1 ) # 生成esg分位数列和MSCI评级层级列 sub <- sub %>% mutate(esgq = ntile(esg, 5), msciq = rating_map[MSCI.ESG.Rating])
原代码的核心问题:
- 评级映射冲突:原代码里
"5"=c("AAA", "A")和"4"="A"把同一个评级A分配到两个层级,逻辑完全混乱,同一个评级只能对应一个层级。 - 因子操作逻辑错误:如果
MSCI.ESG.Rating原本是字符型,直接修改levels不会生效;就算转成因子,你最后用levels(sub$MSCI.ESG.Rating)赋值给msciq,得到的是整个因子的层级列表,不是每行对应的层级值。 - 层级生成方式错误:
mutate(msciq = levels(...))无法生成每行对应的层级,应该用映射表匹配或者因子转数值的方式。
如果偏好使用因子层级的方式实现,也可以这样调整:
sub <- subset(fsdf, select = c(BBG_Ticker, MSCI.ESG.Rating, esg)) sub$MSCI.ESG.Rating <- sub$MSCI.ESG.Rating %>% trimws(which = "both") %>% as.factor() # 重新指定因子层级与对应标签(确保每个评级只归属一个层级) levels(sub$MSCI.ESG.Rating) <- list( "1" = c("B", "CCC"), "2" = "BB", "3" = "BBB", "4" = "A", "5" = "AAA" ) # 将因子转换为数值型得到层级 sub <- sub %>% mutate(esgq = ntile(esg, 5), msciq = as.numeric(MSCI.ESG.Rating))
内容的提问来源于stack exchange,提问作者Ruben Varghese
相关产品推荐
相关产品推荐

