Повторно заменить значения NA из разных столбцов - PullRequest
0 голосов
/ 17 апреля 2019

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)

Я получаю сообщение об ошибке:

Ошибка в median.default (column.numeric, na.rm = TRUE):
нужны числовые данные

Что я делаю не так?

1 Ответ

0 голосов
/ 17 апреля 2019

Мы можем внести некоторые изменения в функцию.Прокрутите столбцы набора данных и найдите, является ли type числовым ('i1') -> возвращает логическое значение vector.Подмножество данных, используя вектор, циклически перебирает столбцы с lapply и replace NA в столбце с median этого столбца

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...