私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
存在する列が変更され、順序付けられた要素が削除される可能性がある場合を関数が処理できるようにしたいと考えています。 .
考え?