如何将数字列中的NA替换为这些列的中位数? [英] How to replace NA's in numerical columns with the median of those columns?

查看:11
本文介绍了如何将数字列中的NA替换为这些列的中位数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理具有多种数据类型的数据框。我只想将数值列上的NA值替换为该特定列的中位数。我遇到过用Mean Mlot替换为Mean Mlot而不是Medium的问题。我的df类似于以下代码:

my_groups <- c(rep("A", 5), rep("B",5))
my_values_1 <- c(4, 9, 10, NA, 5, 12, NA, 7, 11, 8)
my_values_2 <- c(3, NA, 4, 8, 2, 11, 15, NA, 9, 10)
my_df <- data.frame(my_groups, my_values_1, my_values_2)
my_df %>% select_if(is.numeric)

这为我提供了数字列,但我无法计算出下一步。

推荐答案

以下是几种方法。测试数据帧DF在(1)中定义,也用于其他方法。

1)跨行/合并

library(dplyr)

# test data
DF <- data.frame(a = c(NA, NA, 1, 2), b = 1:4, c = letters[1:4])

DF %>% 
  mutate(across(where(is.numeric), ~ coalesce(., median(., na.rm = TRUE))))

给予:

    a b c
1 1.5 1 a
2 1.5 2 b
3 1.0 3 c
4 2.0 4 d

2)dplyr/tidyr交叉/REPLACE_NA

library(dplyr)
library(tidyr)

DF %>% 
  mutate(across(where(is.numeric), ~ replace_na(., median(., na.rm = TRUE))))

3)zoo-na.ggregate

library(zoo)

ok <- sapply(DF, is.numeric)
replace(DF, ok, na.aggregate(DF[ok], FUN = median))

4)Base R

na.median <- function(x) replace(x, is.na(x), median(x, na.rm = TRUE))   
ok <- sapply(DF, is.numeric)
replace(DF, ok, lapply(DF[ok], na.median))

5)Base R-S3

na.median <- function(x, ...) UseMethod("na.median")
na.median.default <- identity
na.median.numeric <- function(x, ...) {
  replace(x, is.na(x), median(x, na.rm = TRUE))   
}

replace(DF, TRUE, lapply(DF, na.median))

6)magrittr我们首先复制DF以避免损坏它--虽然不建议您可以只在最后一行使用DF(如果您不介意覆盖它)--然后使用magrittr%<>%na.median来自(4)。

library(magrittr)

DF2 <- DF
DF2[sapply(DF2, is.numeric)] %<>% lapply(na.median)

7)折叠-ftmvftmv或其同义词ftransformv提供了紧凑表达式。此选项使用na.median来自(4)。

library(collapse)

tfmv(DF, is.numeric, na.median)

这篇关于如何将数字列中的NA替换为这些列的中位数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆