我用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
改变哪些列存在的情况,可能会删除有序因子.
想法?