【发布时间】:2014-07-18 12:38:57
【问题描述】:
我经常使用ddply。我偶尔使用有序因子。在包含有序因子的数据帧上调用 ddply 会丢弃重组数据帧中的任何排序。
我为ddply 编写了以下包装器,它记录了级别排序,然后将其重新应用于最初排序的任何列:
dat <- data.frame(a=runif(10),b=factor(letters[10:1],
levels=letters[10:1],ordered=TRUE),
c = rep(letters[1:2],times=5),
d = factor(rep(c('lev1','lev2'),times=5),ordered=TRUE))
#Drops ordering on b and d
dat1 <- ddply(dat,.(c),transform,log_a = log(a))
ddplyKeepOrder <- function(dat,...){
orderedCols <- colnames(dat)[sapply(dat,is.ordered)]
levs <- lapply(dat[,orderedCols,drop=FALSE],levels)
result <- ddply(.data = dat,...)
ind <- match(orderedCols,colnames(result))
levs <- levs[!is.na(ind)]
orderedCols <- orderedCols[!is.na(ind)]
ind <- ind[!is.na(ind)]
if (length(ind) > 0){
for (i in 1:length(ind)){
result[,orderedCols[i]] <- factor(result[,orderedCols[i]],
levels=levs[[i]],ordered=TRUE)
}
}
return(droplevels(result))
}
#Preserves ordering on b and d
dat2 <- ddplyKeepOrder(dat,.variables = .(c),.fun = transform,log_a = log(a))
我没有彻底检查过这个功能,所以可能有些情况它不能处理。有没有更好/更完整的方法来处理这个问题?如果我想一想,我可能会删除for 循环,我想。
特别是,我在ddply 调用之后进行的检查以查看是否仍然存在任何原始有序因子似乎真的很难看,但我希望该函数能够处理ddply 改变的情况存在哪些列,可能会删除有序因子。
想法?
【问题讨论】:
-
@DWin - 真的,你认为这是一个错误?我在github 上没有看到任何报告(快速检查),这似乎太明显了,没有其他人会抱怨。
-
没有多少人使用有序因子。而且我认为将订单因素更改为未经通知的因素是一个错误。
-
这是一个错误。请报告它,以便我修复它。您可以提供的示例越简单越好。