R语言:如何高效替代多重嵌套ifelse按列优先级生成Col5?
缺失值优先级填充的高效实现方案
问题背景
我有一个包含4列的数据集,各列存在MAR(随机缺失)的缺失值,数据集如下:
col1 col2 col3 col4 7 4 3 7 0 4 7 10 4 5 8 7 1 9 7 8 10 5 1 4 5 3 7 10 7 5 2 2 4 7 2 9 2 6 0 9 9 3 9 6 5 0 7 6
需要生成一列Col5,取值规则按优先级排序:
- 优先取
col1的非缺失值; - 若
col1缺失,取col2的非缺失值; - 若
col1、col2均缺失,取col3的非缺失值; - 若前3列均缺失,取
col4的非缺失值; - 4列全缺失时,
Col5为NA。
预期最终数据集如下:
col1 col2 col3 col4 col5 7 4 3 7 7 0 4 0 7 10 4 7 5 8 7 5 1 9 7 1 8 10 5 8 1 4 5 1 3 3 7 10 7 5 7 2 2 4 2 7 2 7 9 2 9 4 9 4 9 9 6 5 6 0 7 6 0
目前可通过3个嵌套ifelse语句实现,但希望找到更高效的实现方法。
高效实现方法
R语言方案
方法1:使用dplyr::coalesce()函数
coalesce()函数的逻辑就是按输入顺序返回第一个非缺失值,完全匹配需求,代码极简且高效:
library(dplyr) # 假设数据集为df df$Col5 <- coalesce(df$col1, df$col2, df$col3, df$col4)
方法2:基础R原生实现
无需加载额外包,用apply()逐行提取第一个非缺失值:
# 提取目标列,逐行处理 df$Col5 <- apply(df[, c("col1", "col2", "col3", "col4")], 1, function(row) { first_non_na <- row[!is.na(row)] if (length(first_non_na) > 0) first_non_na[1] else NA })
Python语言方案
方法1:pandas.combine_first()链式调用
通过链式调用按优先级依次填充缺失值:
import pandas as pd # 假设数据集为df df['Col5'] = df['col1'].combine_first(df['col2']).combine_first(df['col3']).combine_first(df['col4'])
方法2:pandas.bfill()按行填充
利用后向填充(bfill)按行方向覆盖,取第一列结果即为每行第一个非缺失值:
df['Col5'] = df[['col1', 'col2', 'col3', 'col4']].bfill(axis=1).iloc[:, 0]
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

