我正在使用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,因为它是A=1和B=2时C最常见的值。
我知道,如果我写一个函数来获得频率和相应的值,这是可以做到的,但是,我想知道是否有不那么复杂的方法?
发布于 2018-10-05 14:05:43
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添加一个计数,将C中的NA值替换为C中最常见的非NA值,并整理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)发布于 2018-10-05 17:29:38
基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 0https://stackoverflow.com/questions/52667144
复制相似问题