Я использую 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
изменяет какие столбцы присутствуют, возможно, удаляя упорядоченные факторы.
Мысли?