You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:15:36