функция, которая заменяет NA со средним значением переменных - PullRequest
1 голос
/ 02 мая 2020

Я прочитал все темы, связанные с моим вопросом (я почти уверен, что сделал).

Я написал функцию, которая автоматически проверяет класс переменной, если он числительный c затем приступает к замене NA на среднее значение этих переменных.

Вот код:

delna<-function(x){
    for (e in 1:ncol(x)){
        if (class(x[,e])=="numeric"){
            for (e in 1:ncol(x)) {
                x[is.na(x[,e]),e]<-mean(x[,e],na.rm = TRUE)
            }}
    }
}

Я не получаю никакого результата при проверке функции и при использовании ее во фрейме данных i получить предупреждения, говорящие:

"В mean.default (x [, e], na.rm = TRUE): аргумент не числовой c или логический: возвращение NA"

Спасибо за помощь всем!

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

Это решение сложное, но его использование простое.
Я создаю обобщенный c delna и методы

  1. Метод по умолчанию, чтобы заменить NA в один номер c вектор;
  2. Метод для объектов класса "matrix";
  3. Метод для объектов класса "data.frame";
  4. Метод для объектов класса "list".

Тогда все, что нужно сделать, это позвонить delna(object) и все автоматически c.

delna <- function(x, ...) UseMethod("delna")
delna.default <- function(x, ...){
  stopifnot(is.numeric(x))
  mu <- mean(x, na.rm = TRUE)
  x[is.na(x)] <- mu
  x
}
delna.matrix <- function(x, ...){
  x[] <- apply(x, 2, delna)
  x
}
delna.data.frame <- function(x, ...){
  is_num <- sapply(x, is.numeric)
  x[is_num] <- lapply(x[is_num], delna)
  x
}
delna.list <- function(x, ...){
  is_num <- sapply(x, is.numeric)
  x[is_num] <- lapply(x[is_num], delna)
  x
}


delna(letters)
delna(x)
delna(mat)
delna(dat)
delna(as.list(dat))

Проверить код создания данных.

set.seed(1234)
x <- sample(10)
is.na(x) <- sample(10, 4)
mat <- replicate(5, {
  x <- sample(10)
  is.na(x) <- sample(10, 3)
  x
})
dat <- as.data.frame(mat)
0 голосов
/ 03 мая 2020

оказалось, что я пропустил, чтобы добавить return (x). теперь функция выглядит следующим образом

    delna<-function(x){
  for (e in 1:ncol(x)){
    if (is.numeric(x[,e])){
      x[is.na(x[,e]),e]<-mean(x[,e],na.rm = TRUE)
      }
  }
  return(x)
}

, тогда я смог сделать нужную модификацию, записав данные <-delna (data) или назначив их новому df </p>

0 голосов
/ 02 мая 2020

С data.table, предполагая, что столбцы, которые вы хотите обработать, это "a", "b", "c":

library(data.table)
setDT(df)
lapply(c("a","b","c"), function(colname){
  df[is.na(get(colname)), c(colname) := mean(df[[colname]], na.rm = TRUE)]
})

Нет необходимости переназначения, исходный кадр данных изменяется в место

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...