R语言求助:使用apply系列函数用另一DataFrame填充缺失值
Hey there!作为R新手能想着用apply家族优化代码,已经比很多刚入门的人思路超前啦~其实你这个需求用向量化操作就能搞定,比循环和apply都简洁高效,先给你最直接的方案:
方案1:基础向量索引(最推荐)
假设Records和Results是行数一致的数据框,直接通过布尔索引替换NA值就行:
# 找到Records$time中NA的位置,用Results对应位置的time填充 Records$time[is.na(Records$time)] <- Results$time[is.na(Records$time)]
R是向量型语言,这种操作底层已经优化过,比循环快得多,代码也一目了然。
方案2:用mapply实现(如果你执着于apply家族)
你之前试mapply出错可能是没匹配好两个向量的元素。mapply适合处理多输入的逐元素操作,这里我们给它传两个向量(Records的time和Results的time),然后对每个位置的元素判断:
Records$time <- mapply(function(record_time, result_time) { if (is.na(record_time)) { result_time } else { record_time } }, Records$time, Results$time)
不过说实话,这个写法不如向量索引简洁,只是满足你想用apply家族的需求~
为什么apply/lapply没成功?
apply是针对矩阵/数据框的行或列做批量操作,不是逐元素处理两个向量的对应位置,所以用它会跑偏;lapply是对列表的单个元素循环,你这里需要同时处理两个向量的对应元素,所以lapply也不适用。
额外推荐:tidyverse风格写法(更易读)
如果之后经常处理数据框,推荐学一下dplyr包,代码可读性拉满:
library(dplyr) Records <- Records %>% mutate(time = if_else(is.na(time), Results$time, time))
不用纠结apply啦,R里很多时候向量化操作才是最优解~
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

