2012-04-16 34 views
0

我有一個數據幀,我試圖採取因子變量,只保留前31的水平,使所有其他級別的一些通用的水平。一個R函數爲載體

我需要跨越幾個向量,所以我想我會創建功能做到這一點,但我沒有多少運氣。我想我需要以某種方式使用mapplyVectorize,但我不認爲我正確地做這件事,因爲我得到有關無法分配內存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) 

任何建議?

回答

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,因爲我懷疑可能是加快速度(這在你的案例中似乎很重要),儘管我沒有測試過,看看它實際上會有多快。

+0

+1,但不是'unusedLevels'實際上'levelsToKeep'? – Tommy 2012-04-16 23:49:12

+0

@Tommy Dang,我知道這件事嗎?我會修復它... – joran 2012-04-17 00:14:46

+0

這樣做。非常感謝你。 – screechOwl 2012-04-17 04:45:20