Вменение нескольких столбцов в R с помощью mutate_at - PullRequest
0 голосов
/ 31 марта 2020

У меня есть большой медицинский фрейм данных, который я хочу использовать для ML. Таким образом, я должен вменять пропущенные значения. Для переменных рода Continus я хотел бы поставить медианное значение, например, так:

dat$First_Wbc <- ifelse(is.na(dat$First_Wbc), median2(dat$First_Wbc), dat$First_Wbc)

Я хочу создать код, используя mutate_at, который будет делать то же самое, что и код, который я предоставил выше, но для нескольких переменных в время. Я знаю, что это возможно, но до сих пор я не смог правильно отформатировать его. Не могли бы вы мне помочь?

Примечание: median2 () - это функция, идентичная медиане (), но она игнорирует пропущенные значения

Ответы [ 3 ]

2 голосов
/ 31 марта 2020

Решение Base R:

dat[,sapply(dat, is.numeric)] <- lapply(dat[,sapply(dat, is.numeric)], 
                                        function(x){
                                         x <- ifelse(is.na(x), median(x, na.rm  = TRUE), x)
                                          }
                                        )

Tidyverse с использованием mutate_if:

library(tidyverse)
df %>% 
  mutate_if(is.numeric, funs(replace(., is.na(.), median(., na.rm = TRUE))))
2 голосов
/ 31 марта 2020

Вы можете выбрать столбцы по позиции:

library(dplyr)
df %>% mutate_at(2:4, ~replace(., is.na(.), median2(.)))

Или по диапазону столбцов

df %>% mutate_at(vars(a:d), ~replace(., is.na(.), median2(.)))

Или используя указанный c шаблон в именах столбцов.

df %>% mutate_at(vars(starts_with('col')), ~replace(., is.na(.), median2(.)))
1 голос
/ 31 марта 2020

Мы можем использовать mutate_if с na.aggregate

library(dplyr)
library(zoo)
df %>% 
   mutate_if(is.numeric, na.aggregate, FUN = median)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...