如何合并data.table中的对应列并跳过NA值生成结果表?
解决方案
下面提供几种针对data.table的高效实现方式:
方法1:使用fcoalesce函数(推荐)
fcoalesce是data.table内置函数,专门用于逐行提取第一个非NA值,完美适配你的需求,且同时支持数值型和字符型列:
library(data.table) a <- data.table(col1 = c(1, 2, 3, NA, NA), col2 = c(NA, NA, NA, 4, 5), col3 = c("a", "b", "c", NA, NA), col4 = c(NA, NA, NA, "d", "e")) # 合并列并生成目标表 result <- a[, .(col1 = fcoalesce(col1, col2), col2 = fcoalesce(col3, col4))]
执行后得到的result就是你需要的输出格式。
方法2:利用ifelse逐行判断
如果不想用fcoalesce,也可以用基础逻辑判断,分别处理数值列和字符列:
result <- a[, .(col1 = ifelse(is.na(col1), col2, col1), col2 = ifelse(is.na(col3), col4, col3))]
这种方法逻辑直观,但当需要合并的列数增多时,写法会比fcoalesce繁琐。
方法3:行级汇总(仅适用于数值列)
你之前尝试的sum函数可针对数值列使用,需开启na.rm=TRUE跳过NA,但该方法不支持字符列,仅作补充参考:
# 仅处理数值列col1和col2 a[, col1_combined := rowSums(.SD, na.rm = TRUE), .SDcols = c("col1", "col2")]
内容的提问来源于stack exchange,提问作者s.cerioli
相关产品推荐
相关产品推荐

