2012-04-16 14 views
0

私はデータフレームを持っています。私は因子変数をとり、上位31レベルだけを保持し、他のすべてのレベルをいくつかの一般的なレベルにしようとしています。ベクトルのR関数

私はいくつかのベクトルに渡ってこれを行う必要があるので、私は関数を作成すると思ったが、私は多くの運がない。私は何とかmapplyまたはVectorizeを使用する必要があると思うが、3.6ギガバイトのメモリを割り当てることができないというエラーメッセージが表示されるので、適切にやっているとは思わない。

これは私がこのような何かを書くことができるようにしたいのですが、xがベクトルで、トップカウントが

createFactor <-function(x, topCount){ 
    table1 <- data.frame(table(x)) 
    table1 <- table1[order(-table1$Freq),] 
    noChange <- table1$Var1[1:topCount] 
    newVals1 <- factor(ifelse(x %in% noChange, x, "-1000")) 
    newVals1 
} 

を保つためにレベルの数である関数である:

df1$topLevels <- createFactor(df1$fact1, 31) 

どれでも提案?

答えて

3

私はこれの性能特性について完全に一定ではないんだけど、私はおそらくより多くのようにように、この関数を書かれているだろう:私は5月である疑いがあるので、私はtabulateではなく、tableを使用しました

topK <- function(x,k){ 
    tbl <- tabulate(x) 
    names(tbl) <- levels(x) 
    x <- as.character(x) 
    levelsToKeep <- names(tail(sort(tbl),k)) 
    x[!(x %in% levelsToKeep)] <- '-1000' 
    factor(x) 
} 

を私はこれを実際にはるかに速く参照してこれをテストしていませんが、より速く(あなたのケースでは重要と思われます)。

+0

+1実際には 'unusedLevels'は' levelsToKeep'ではありませんか? – Tommy

+0

@トミーダン、それを後ろに持ってきたのですか?私はそれを修正します... – joran

+0

それをしました。どうもありがとうございました。 – screechOwl

関連する問題