Свертывание факторного уровня для всех факторных переменных в фрейме данных на основе подсчета
Я хотел бы сохранить только верхние 2 уровня факторов на основе частоты и сгруппировать все остальные факторы в другие. Я пробовал это, но это не помогает.
df=data.frame(a=as.factor(c(rep('D',3),rep('B',5),rep('C',2))),
b=as.factor(c(rep('A',5),rep('B',5))),
c=as.factor(c(rep('A',3),rep('B',5),rep('C',2))))
myfun=function(x){
if(is.factor(x)){
levels(x)[!levels(x) %in% names(sort(table(x),decreasing = T)[1:2])]='Others'
}
}
df=as.data.frame(lapply(df, myfun))
Ожидаемый Результат
a b c
D A A
D A A
D A A
B A B
B A B
B B B
B B B
B B B
others B others
others B others
2 ответа:
Это может быть немного запутанным, но вот один подход через базу R,
fun1 <- function(x){levels(x) <- c(names(sort(table(x), decreasing = TRUE)[1:2]), rep('others', length(levels(x))-2)); return(x)}
Однако вышеупомянутая функция должна быть сначала переупорядочена и, как говорится в комментарии OP, правильной будет,
fun1 <- function(x){ x=factor(x, levels = names(sort(table(x), decreasing = TRUE))); levels(x) <- c(names(sort(table(x), decreasing = TRUE)[1:2]), rep('others', length(levels(x))-2)); return(x) }