如何用dplyr将NA替换为行中位数与列中位数的较小值?
用dplyr实现NA值替换为行中位数与列中位数的较小值
针对你的需求,我们可以通过dplyr的行操作、列操作结合条件替换来实现,以下是完整的可运行代码:
library(dplyr) # 构建你的示例数据集 df <- structure(list( a1 = c(1, 2, 1), a2 = c(1, NA, 1), a3 = c(1, 2, 1) ), class = "data.frame", row.names = c("A", "B", "C")) # 第一步:计算所有数值列的中位数(忽略NA) col_medians <- df %>% summarise(across(is.numeric, ~median(., na.rm = TRUE))) # 第二步:逐行计算中位数,替换NA为行中位数与列中位数的较小值 df_clean <- df %>% rowwise() %>% # 计算当前行的数值列中位数 mutate(row_med = median(c_across(is.numeric), na.rm = TRUE)) %>% ungroup() %>% # 遍历数值列,替换NA mutate(across(is.numeric, ~ifelse(is.na(.), pmin(row_med, col_medians[[cur_column()]]), .))) %>% # 移除临时的行中位数列 select(-row_med) # 输出结果 df_clean
代码说明
rowwise()配合c_across(is.numeric):实现逐行计算所有数值列的中位数,临时存储在row_med列;col_medians:提前计算每一列的中位数,后续通过cur_column()匹配当前处理列的对应中位数;pmin():直接取行中位数和列中位数中的较小值,作为NA的替换值;- 最后用
select(-row_med)清理临时列。
运行输出
a1 a2 a3 A 1 1 1 B 2 1 2 C 1 1 1
内容的提问来源于stack exchange,提问作者Samira
相关产品推荐
相关产品推荐

