替换不同列中的NA值

时间:2019-04-17 09:48:16

标签: r

R替换问题

不能在数据集中将不同列的NA值替换为具有NA值的同一列的中位数。

Titanic.new是数据集。

我尝试过:

fun3<-function(x)
{
      column.numeric<-x[,sapply(x,is.numeric)]
      column.numeric[which(is.na(column.numeric))]<-median(column.numeric,na.rm = TRUE)
      return(column.numeric)
}
    fun3(titanic.new)

我遇到错误:

  

neural.default(column.numeric,na.rm = TRUE)错误:
  需要数字数据

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我们可以对该函数进行一些修改。遍历数据集的列,查找type是否为数字('i1')->返回逻辑vector。使用向量对数据进行子集设置,使用lapplyreplace遍历各列,并使用该列的median遍历该列中的NA

fun3<-function(x){
    i1 <- sapply(x,is.numeric)
    x[i1] <- lapply(x[i1], function(y) replace(y, is.na(y), median(y, na.rm = TRUE)))
    x
 }
fun3(titanic.new)

或者可以通过tidyverse

完成
library(tidyverse)
titanic.new %>% 
     mutate_if(is.numeric, list(~ replace(., is.na(.), median(., na.rm = TRUE))))

也可以包装在函数中

fun4 <- function(x) {
       x %>%
           mutate_if(is.numeric,
               list(~ replace(., is.na(.), median(., na.rm = TRUE))))
     }

此外,使用na.aggregate

可以更紧凑地完成此操作
library(zoo)
i1 <-  sapply(titanic.new, is.numeric)
titanic.new[i1] <- na.aggregate(titanic.new[i1], FUN = median)