Как создать функцию messy_impute (), которая вменяет значения NA в беспорядочные данные со средним или медианным значением? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть следующий фрейм данных для ученика с домашним заданием и оценками за экзамен.

> student1
         UID Homework_1 Homework_2 Homework_3 Homework_4 Homework_5 Homework_6 Homework_7 Homework_8
10 582493224         59         99          88         10         66         90         50         80
   Homework_9 Homework_10 Exam_1 Exam_2 Exam_3 Section
10         16          NA     41     61     11       A

Отсутствует оценка Homework_10, и мне нужно создать функцию для вменения значения NA со средним или медианным значением.

Функция messy_impute должна иметь следующие аргументы:

данные: фрейм данных или таблица для вменения.

центр: вменять с использованием среднего или медианного значения.

поле: использовать ли строку или столбец для ввода значения (1 - использовать строку 2 - использовать столбец).

Например,

messy_impute(student1,mean,1) should print out 

> student1
         UID Homework_1 Homework_2 Homework_3 Homework_4 Homework_5 Homework_6 Homework_7 Homework_8
10 582493224         59         99          88         10         66         90         50         80
   Homework_9 Homework_10 Exam_1 Exam_2 Exam_3 Section
10         16          **62**    41     61     11       A

since the mean of the rest of the homework is 62.

И, если среднее значение столбцы (другие учащиеся) в разделе A для домашнего задания 10 - 50, затем

messy_impute(student1,mean,2) should print out 

> student1
         UID Homework_1 Homework_2 Homework_3 Homework_4 Homework_5 Homework_6 Homework_7 Homework_8
10 582493224         59         99          88         10         66         90         50         80
   Homework_9 Homework_10 Exam_1 Exam_2 Exam_3 Section
10         16          **50**    41     61     11       A

, поскольку среднее значение столбцов в разделе A равно 50.

Обратите внимание на если поле равно 2, тогда расчет должен производиться в том же разделе.

Я действительно застрял на этом определении функции.

1 Ответ

0 голосов
/ 02 августа 2020

Раствор Base R:

  # Define function to Impute a row-wise mean (assumes one observation per student):
row_wise_mean_impute <- function(df){
  grade_df <- df[,names(df) != "studid"]
  return(cbind(df[,c("studid"), drop = FALSE], 
         replace(grade_df, is.na(grade_df), apply(grade_df, 1, mean, na.rm = TRUE))))
}


# Apply function: 
row_wise_mean_impute(student1)

Данные:

x <- c(rnorm(85, 50, 3), rnorm(15, 50, 15))
student1 <- cbind(studid = 1010101, data.frame(t(x)))
student1[, 10] <- NA_real_ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...