基于列名模式与条件替换data.table中NA值的技术咨询
解决方案(data.table 通用实现)
基于列名后缀匹配的方式,我们可以实现无需依赖列位置、具备可扩展性的需求处理:
library(data.table) # 自动提取所有以eePD开头的目标列 ee_cols <- grep("^eePD", names(df3), value = TRUE) # 生成对应的wePD开头的匹配列名 we_cols <- sub("^ee", "we", ee_cols) # 仅在Class为CORP的行中,将eePD*列的NA替换为对应wePD*列的值 df3[Class == "CORP", (ee_cols) := mapply(fcoalesce, .SD, mget(we_cols)), .SDcols = ee_cols]
代码说明:
- 列名自动匹配:用
grep识别所有eePD前缀的列,再通过sub替换前缀得到对应wePD列,后续新增同类列(如eePD4/wePD4)时无需修改代码。 - 条件范围控制:仅对
Class == "CORP"的行执行替换,RETAIL行的NA保持原样。 - NA替换逻辑:
fcoalesce函数会取第一个非NA值,即当eePD*为NA时用对应wePD*值填充,否则保留原eePD*的值。
运行结果验证:
处理后的df3如下:
Scenario Rating Class wePD1 wePD2 wePD3 eePD1 eePD2 eePD3 1: Basic 1C CORP 0.51 0.74 0.43 0.51 0.74 0.43 2: Basic 2A CORP 0.41 0.01 0.23 0.37 0.06 0.81 3: Basic 2B CORP 0.58 0.28 0.04 0.96 0.29 0.85 4: Basic 2C CORP 0.28 0.92 0.62 0.22 0.22 0.78 5: Basic 3A RETAIL 0.68 0.48 0.71 NA NA NA
可见:
- CORP行的NA已被对应wePD*值替换(第一行)
- CORP行的非NA值完全保留(第二至四行)
- RETAIL行的NA未做修改(第五行)
内容的提问来源于stack exchange,提问作者Ingrid
相关产品推荐
相关产品推荐

