如何用R编写apply族实现的NA值滑动均值自动填充函数
R缺失值均值填充函数实现
函数参数调整说明
你最初设想的函数参数存在语法问题,我们先对参数做兼容调整:如果需要保留type参数用于后续扩展其他填充逻辑,可以保留该参数,默认设置为均值填充模式,lag参数默认设为2。
完整实现代码
x <- function(data, type = "mean", lag = 2) { # 仅支持均值填充模式,其他模式可后续扩展 if (type != "mean") { stop("当前仅支持mean类型的填充方式") } # 按列遍历数据集,符合apply族实现要求 filled_data <- apply(data, 2, function(col_vals) { col_length <- length(col_vals) # 遍历当前列的每一个位置 sapply(seq_along(col_vals), function(i) { # 非缺失值直接返回原值 current_val <- col_vals[i] if (!is.na(current_val)) { return(current_val) } # 计算滑动窗口的上下边界 win_start <- i - lag win_end <- i + lag # 边界合法时用窗口内非缺失值的均值填充 if (win_start >= 1 && win_end <= col_length) { win_vals <- col_vals[win_start:win_end] valid_win_vals <- win_vals[!is.na(win_vals)] # 窗口内全为缺失值时降级到全局均值填充 if (length(valid_win_vals) > 0) { return(mean(valid_win_vals)) } } # 边界不合法时用当前列全局非缺失值的均值填充 return(mean(col_vals, na.rm = TRUE)) }) }) # 转换为data.frame格式返回,和输入格式保持一致 return(as.data.frame(filled_data)) }
逻辑说明
- 用
apply(data, 2, ...)实现按列遍历,完全符合你要求的apply族函数实现规则 - 对每一列的元素做逐位判断:
- 非缺失值直接保留,不做修改
- 遇到缺失值时先判断当前位置前后是否有足够的
lag个有效索引,满足条件则取窗口内所有非缺失值的均值填充 - 处于列首尾的边界缺失值、或者窗口内无有效非缺失值时,自动降级为当前列全局非缺失值的均值填充
测试验证
用你给出的示例数据集测试:
# 构造示例数据集 test_df <- data.frame( V1 = c(3,5,1,5,7,4), V2 = c(7,8,2,6,2,8), V3 = c(8,9,4,0,3,7), V4 = c(0,2,5,NA,6,4), V5 = c(8,8,0,3,11,5), V6 = c(12,9,6,9,14,3), V7 = c(2,1,7,10,2,NA) ) # 调用函数 result <- x(test_df)
运行后得到的结果中,V4列第4行填充值为4.25(即17/4),V7列第6行填充值为4.4(即22/5),完全符合要求的填充规则。
内容的提问来源于stack exchange,提问作者Rojer
相关产品推荐
相关产品推荐

