2016-08-05 2 views
2

周波数に基づいて上位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)) 

期待以上の関数が最初に再する必要があります。しかしこれは、ベースRを経由して一つのアプローチがあり、ここで少し厄介かもしれませんが、

 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 
+0

データフレームまたは列全体の要因の頻度を計算しますか?あなたの期待される結果を共有してください。 –

+0

それは、単一の変数のためだけであり、私は頻度に基づいて上位2因子を保持し、他のすべてのレベルを他のものとしてグループ化する。 –

+0

上記のデータフレームで予想される出力を追加できますか? – thepule

答えて

2

出力、

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) } 
0

これは今度はパッケージのfct_lump()のおかげで簡単です。

fct_lump(df$a, n = 2) 

# [1] D  D  D  B  B  B  B  B  Other Other 
# Levels: B D Other 

最も一般的なレベルの数は、他の人を一緒にひとまとめ、保存されるべき制御n引数。

関連する問題