如何基于indicator列规则,用apply函数填充R数据框中的缺失值?
使用apply按列填充NA值的解决方案
没问题,我来帮你搞定这个按规则填充NA的需求,用apply(MARGIN=2)完全可以实现。先理清楚思路:我们需要对col1和col2逐列处理,遇到NA时根据对应行的indicator值选择填充10还是0。
第一步:确认你的数据框
先把你的数据框构造出来(方便后续测试和验证):
library(tibble) df <- tibble('col1' = c(NA, 1, 2), 'col2' = c(34, NA, 44), 'indicator' = c(1,1,0))
第二步:用apply按列执行填充逻辑
核心代码如下,每一步都加了注释说明:
# 只处理col1和col2,保留indicator列不变 df[, c("col1", "col2")] <- apply( X = df[, c("col1", "col2")], # 指定需要处理的目标列 MARGIN = 2, # MARGIN=2表示按列遍历处理 FUN = function(x) { # 定位当前列中所有NA的位置 na_positions <- is.na(x) # 对NA位置的元素,根据对应行的indicator值填充:indicator==1填10,否则填0 x[na_positions] <- ifelse(df$indicator[na_positions] == 1, 10, 0) # 返回处理后的列 return(x) } )
第三步:查看处理后的结果
运行完代码后,你的数据框会变成这样:
> df # A tibble: 3 × 3 col1 col2 indicator <dbl> <dbl> <dbl> 1 10 34 1 2 1 10 1 3 2 44 0
完全符合你的要求:第一行col1的NA因indicator=1被填充为10,第二行col2的NA因indicator=1被填充为10,非NA值全部保留原样。
补充说明
你提到已经用complete.cases标记了不完整案例,其实也可以用这个标记列替代is.na(x)来定位缺失值,但直接用is.na(x)识别当前列的NA更直接,不需要依赖额外的标记列。
内容的提问来源于stack exchange,提问作者steves
相关产品推荐
相关产品推荐

