R语言合并含互补NA值的两列为无NA单列并删除原列
问题描述
现有如下结构的R数据框(tidytable/data.table类型):
structure(list(RFM_Score_Meaning.x = c("Dropped", "Dropped", "Dropped", "Dropped", "Dropped", "Dropped", "Dropped", NA, NA, NA, NA, NA, NA, NA, NA, NA), RFM_Score_Meaning.y = c(NA, NA, NA, NA, NA, NA, NA, "Need Encouragement", "Need Encouragement", "Need Encouragement", "Need Encouragement", "Need Encouragement", "Need Encouragement", "Need Encouragement", "Need Encouragement", "Need Encouragement")), row.names = c(NA, -16L), class = c("tidytable", "data.table", "data.frame"), .internal.selfref = <pointer: 0x000002470fabbfe0>)
两列的NA位置完全互补:RFM_Score_Meaning.x的NA行对应RFM_Score_Meaning.y的有效值,反之亦然。需要删除这两列,生成一列包含所有有效值且无NA的新列。
解决方案
以下是几种实用的实现方法:
方法1:使用tidyverse/dplyr的coalesce()
coalesce()函数会逐行取第一个非NA的值,完美适配这种互补列的合并场景:
library(dplyr) # 合并列并删除原列 df <- df %>% mutate(RFM_Score_Meaning = coalesce(RFM_Score_Meaning.x, RFM_Score_Meaning.y)) %>% select(-RFM_Score_Meaning.x, -RFM_Score_Meaning.y)
方法2:Base R原生实现
无需加载额外包,用ifelse判断每行的NA情况:
# 生成新列 df$RFM_Score_Meaning <- ifelse(is.na(df$RFM_Score_Meaning.x), df$RFM_Score_Meaning.y, df$RFM_Score_Meaning.x) # 删除原两列 df <- df[, !names(df) %in% c("RFM_Score_Meaning.x", "RFM_Score_Meaning.y")]
方法3:data.table/tidytable原生语法
针对你的数据框类型,用data.table的fcoalesce()更高效:
library(data.table) # 或 tidytable # 生成新列并删除原列 df[, RFM_Score_Meaning := fcoalesce(RFM_Score_Meaning.x, RFM_Score_Meaning.y)][, c("RFM_Score_Meaning.x", "RFM_Score_Meaning.y") := NULL]
内容的提问来源于stack exchange,提问作者hachiko
相关产品推荐
相关产品推荐

