Функция замены отсутствующего на медиану для всего кадра данных - PullRequest
1 голос
/ 19 июня 2019

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

library(dplyr)
test = data.frame(a=1:6,b=c("a","b",NA,NA,NA,"c"),c=c(1,1,1,1,2,NA),d=c("a","a","c",NA,NA,"b"))

fun_rep_na = function(df){
  for(i in colnames(df)){
    j<-sym(i)
    df = df %>% mutate(!!j=if_else(is.na(!!j),median(!!j, na.rm=TRUE),!!j))
  }
}

Я вижу, что tidyr *В 1005 * есть функция replace_na, но я не уверен, как ее использовать.В любом случае, пользовательская функция - это то, что мне нужно.

Приведенный выше код выдает мне ошибку.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Я думаю, что вы ищете Mode, а не медиану

Принимая Mode функцию из здесь

Mode <- function(x) {
   ux <- unique(x)
   ux[which.max(tabulate(match(x, ux)))]
}

library(dplyr)

test %>%  mutate_all(~replace(., is.na(.), Mode(na.omit(.))))

#  a b c d
#1 1 a 1 a
#2 2 b 1 a
#3 3 a 1 c
#4 4 a 1 a
#5 5 a 2 a
#6 6 c 1 b
1 голос
/ 19 июня 2019

Мы можем использовать mutate_if с median, так как median работает только на numeric столбцах

test %>% 
   mutate_if(is.numeric, list(~ replace(., is.na(.), median(., na.rm = TRUE))))

Если мы хотим, чтобы значение наиболее повторялось, нам может понадобиться Mode

Mode <- function(x) {
  x <- x[!is.na(x)]
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

Функция Mode была впервые обновлена ​​здесь

test %>% 
  mutate_all(list(~ replace(., is.na(.), Mode(.))))
#  a b c d
#1 1 a 1 a
#2 2 b 1 a
#3 3 a 1 c
#4 4 a 1 a
#5 5 a 2 a
#6 6 c 1 b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...