0

我有一个数据框,我试图采用一个因子变量,只保留前 31 个级别,并使所有其他级别成为通用级别。

我需要跨多个向量执行此操作,所以我想我会创建函数,但我运气不佳。我认为我需要以某种方式使用mapply,或者Vectorize但我认为我没有正确执行它,因为我收到有关无法分配 3.6 gigs 内存的错误消息。

这是函数,其中 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 回答