我正在与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
的最常用值。
我知道如果编写一个函数来获取频率和相应的值就可以做到,但是,我想知道是否有更简单的方法?
答案 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
说明:按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)
答案 1 :(得分:0)
(很长的行很抱歉)
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