根据其他两个变量的值,用最常见的一个替换缺失值

时间:2018-10-05 13:50:24

标签: r

我正在与R合作,并拥有一个由三个变量组成的数据集: ABC。变量C具有一些NA观察值,我希望将其替换为具有相同CA数量的最常见值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,因为当CA=1时,它是B=2的最常用值。
我知道如果编写一个函数来获取频率和相应的值就可以做到,但是,我想知道是否有更简单的方法?

2 个答案:

答案 0 :(得分:1)

一个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

说明:按AB对条目进行分组,为每个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)

答案 1 :(得分:0)

基本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