You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:00:16