замените отсутствующий режим на столбец коэффициента и среднее значение для числового столбца в r - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть следующий фрейм данных, названный "поезд". столбцы bflag и zfactor являются факторами, а остальные 2 столбца являются числовыми. Я хочу заменить отсутствующие значения столбцов фактора режимом, а отсутствующие значения числовых переменных - средним значением в одном и том же фрейме данных. Как я могу сделать это в R?

ID   bflag  vcount zfactor vnumber
1     0       12      1       12
2     1       NA      0       8
3     0       3       0       9
4     1       13      0       NA
5     1       2       1       2
6     NA      10      NA      NA

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

dplyr::mutate_if поможет определить тип столбца и функцию / операцию (mode/mean), которая необходима для этого столбца. Решение будет:

library(dplyr)
df %>% mutate_if(is.numeric, funs(replace(.,is.na(.), mean(., na.rm = TRUE)))) %>%
  mutate_if(is.factor, funs(replace(.,is.na(.), Mode(na.omit(.)))))

#   ID bflag vcount zfactor vnumber
# 1  1     0     12       1   12.00
# 2  2     1      8       0    8.00
# 3  3     0      3       0    9.00
# 4  4     1     13       0    7.75
# 5  5     1      2       1    2.00
# 6  6     1     10       0    7.75

Примечание: Функция Mode взята из ответа @RichScriven. Ссылка для функции Mode находится на ( Есть ли встроенная функция для нахождения режима? )

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
0 голосов
/ 28 апреля 2018

В базе R вы можете перебирать столбцы и использовать простой оператор if. Нам нужно будет определить функцию для режима, поскольку база R не предоставляет ее.

df[-1] <- lapply(df[-1], function(x) {
    if(is.factor(x)) replace(x, is.na(x), Mode(na.omit(x)))
    else if(is.numeric(x)) replace(x, is.na(x), mean(x, na.rm=TRUE))
    else x
})

df
#   ID bflag vcount zfactor vnumber
# 1  1     0     12       1   12.00
# 2  2     1      8       0    8.00
# 3  3     0      3       0    9.00
# 4  4     1     13       0    7.75
# 5  5     1      2       1    2.00
# 6  6     1     10       0    7.75

Данные и Mode функция:

df <- read.table(text = "ID   bflag  vcount zfactor vnumber
1     0       12      1       12
2     1       NA      0       8
3     0       3       0       9
4     1       13      0       NA
5     1       2       1       2
6     NA      10      NA      NA", 
colClasses = rep(c("numeric", "factor"), length.out=5), 
header = TRUE)

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

Mode позаимствовано у Есть ли встроенная функция для нахождения режима?

...