0

私はデータ フレームを持っており、因子変数を取り、上位 31 レベルのみを保持し、他のすべてのレベルを一般的なレベルにしようとしています。

いくつかのベクトルでこれを行う必要があるため、関数を作成すると考えましたが、あまり運がありません。何らかの方法でmapplyorを使用する必要Vectorizeがあると思いますが、3.6 ギガのメモリを割り当てることができないというエラー メッセージが表示されるため、正しく行っているとは思いません。

これは、x がベクトルで、topCount が保持するレベルの数である関数です。

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)

助言がありますか ?

4

1 に答える 1

3

これのパフォーマンス特性について完全には確信が持てませんが、おそらくこの関数を次のように記述したでしょう。

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

私が使用したのは、実際にどれだけ高速になるかをテストしていませんが、より高速である可能性があるためtabulateではなくtable(これはあなたのケースでは重要と思われます)。

于 2012-04-16T23:44:21.387 に答える