Замена пропущенных значений наиболее частыми на основе значений двух других переменных - PullRequest
0 голосов
/ 05 октября 2018

Я работаю с R и у меня есть набор данных, который состоит из трех переменных: например, A, B и C.Переменная C имеет несколько NA наблюдений, которые я хочу заменить на наиболее частое значение C с теми же величинами A и B.Например, в следующем наборе данных:

   A B  C
1  1 2  0
2  2 1  1
3  1 1  1
4  3 1  1
5  1 2  0
6  1 2  0
7  2 3  0
8  1 2  1
9  3 3  0
10 1 2 NA

Здесь я хотел бы заменить NA на 0, поскольку это наиболее частое значение C, когда A=1 и B=2.
Я знаю, что это можно сделать, если я напишу функцию для получения частот и соответствующих значений, однако мне было интересно, есть ли менее сложные способы?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

база R

(извините за очень длинную линию)

unsplit(lapply(split(df, list(df$A, df$B), drop=TRUE), function(.) {.$C[is.na(.$C)] <- names(which.max(table(.$C)));.}), interaction(df$A, df$B, drop = TRUE))

# output
   A B C
1  1 2 0
2  2 1 1
3  1 1 1
4  3 1 1
5  1 2 0
6  1 2 0
7  2 3 0
8  1 2 1
9  3 3 0
10 1 2 0
0 голосов
/ 05 октября 2018

A tidyverse опция

library(tidyverse)
df %>%
    group_by(A, B) %>%
    add_count(C) %>%
    mutate(C = if_else(is.na(C), C[which.max(n)], C)) %>%
    select(-n) %>%
    ungroup()
# A tibble: 10 x 3
       A     B     C
   <int> <int> <int>
 1     1     2     0
 2     2     1     1
 3     1     1     1
 4     3     1     1
 5     1     2     0
 6     1     2     0
 7     2     3     0
 8     1     2     1
 9     3     3     0
10     1     2     0

Объяснение: Сгруппируйте записи по A и B, добавьте счетчик для каждого C, замените NA значения в C насамое частое не NA значение в C и приведите в порядок tibble для воспроизведения ожидаемого результата.


Пример данных

df <- read.table(text =
    "   A B  C
1  1 2  0
2  2 1  1
3  1 1  1
4  3 1  1
5  1 2  0
6  1 2  0
7  2 3  0
8  1 2  1
9  3 3  0
10 1 2 NA
", header = T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...