我有一个数据框,我正在尝试使用因子变量,只保留前31个级别,并使所有其他级别成为通用级别。
我需要在几个向量中执行此操作,所以我想我会创建函数,但我没有太多运气。我想我需要以某种方式使用mapply
或Vectorize
,但我认为我没有正确地执行此操作,因为我收到有关无法分配3.6 GB内存的错误消息。
这是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)
有什么建议吗?
答案 0 :(得分: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
,因为我怀疑它可能更快(这在你的情况下看起来很重要)虽然我没有测试过它看看实际上会有多快是