Как написать функцию, которая вменяет пропущенные числовые и символьные значения? - PullRequest
2 голосов
/ 11 марта 2019

У меня есть следующие образцы данных:

ID GLUC TGL HDL LDL HRT MAMM SMOKE

A   88   NA  32  99   Y   NA never

B   NA   150 60  NA  NA   no never

C   110   NA NA 120   N   NA    NA

D   NA   200 65 165  NA  yes never

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

Мой желаемый результат с функцией ниже:

impute (dat=patient, varlist=c("LDL", "HRT", "MAMM"))
LDL HRT MAMM
 99   Y  yes
165   Y   no
120   N  yes
165   Y  yes
150   Y  yes

У меня написаны эти переменные, но я изо всех сил пытаюсь собрать их вместе в функцию.

patient$TGL[which(is.na(patient$TGL))] <- median(patient$TGL, na.rm=TRUE)
patient$TGL[which(is.na(patient$TGL))] <- which.max(patient$TGL, na.rm=TRUE)

Как мне достичь желаемого результата?

1 Ответ

1 голос
/ 11 марта 2019

Вот способ установить значения, как вы предполагали в вашем примере с функциями:

library(foreach)

patient = read.table(
  textConnection("ID GLUC TGL HDL LDL HRT MAMM SMOKE
A   88   NA  32  99   Y   NA never
B   NA   150 60  NA  NA   no never
C   110   NA NA 120   N   NA    NA
D   NA   200 65 165  NA  yes never"),  header = TRUE)

#' imputes vector values
impute_v <- function(x) {
  if (is.numeric(x)) {
    res <- median(x, na.rm = TRUE)
  }
  else {
    res <- x[which.max(x)]
  }
  na.index <- which(is.na(x))
  x[na.index] <- res
  x
}

# returns imputed values for selected columns in a data frame
impute_df <- function(df, names) {
  foreach(name = names) %do% {
    df[, name] <- impute_v(df[, name])
  }
  df[, names]
}

impute_df(patient, names = c("LDL", "HRT", "MAMM"))
#    LDL HRT MAMM
# 1  99   Y  yes
# 2 120   Y   no
# 3 120   N  yes
# 4 165   Y  yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...