Finalmente he decidido poner el método sort.data.frame que está flotando en Internet en un paquete R. Simplemente se solicita demasiado como para dejarlo en un método ad hoc de distribución.¿La mejor manera de crear una coherencia genérica/de método para sort.data.frame?
Sin embargo, está escrito con argumentos que hacen que sea incompatible con la función de clasificación genérica:
sort(x,decreasing,...)
sort.data.frame(form,dat)
si cambio sort.data.frame
tomar disminuyendo como un argumento como en sort.data.frame(form,decreasing,dat)
y desechar decreciente, entonces pierde su sencillez, porque siempre tendrá que especificar dat=
y realmente no puede usar argumentos posicionales. Si lo agrego al final como en sort.data.frame(form,dat,decreasing)
, entonces el orden no coincide con la función genérica. Si espero que la disminución quede atrapada en los puntos `sort.data.frame (form, dat, ...), entonces cuando use la coincidencia basada en posición, creo que la función genérica asignará la segunda posición a la disminución y se obtendrá descartado. ¿Cuál es la mejor manera de armonizar estas dos funciones?
La función completa es:
# Sort a data frame
sort.data.frame <- function(form,dat){
# Author: Kevin Wright
# http://tolstoy.newcastle.edu.au/R/help/04/09/4300.html
# Some ideas from Andy Liaw
# http://tolstoy.newcastle.edu.au/R/help/04/07/1076.html
# Use + for ascending, - for decending.
# Sorting is left to right in the formula
# Useage is either of the following:
# sort.data.frame(~Block-Variety,Oats)
# sort.data.frame(Oats,~-Variety+Block)
# If dat is the formula, then switch form and dat
if(inherits(dat,"formula")){
f=dat
dat=form
form=f
}
if(form[[1]] != "~") {
stop("Formula must be one-sided.")
}
# Make the formula into character and remove spaces
formc <- as.character(form[2])
formc <- gsub(" ","",formc)
# If the first character is not + or -, add +
if(!is.element(substring(formc,1,1),c("+","-"))) {
formc <- paste("+",formc,sep="")
}
# Extract the variables from the formula
vars <- unlist(strsplit(formc, "[\\+\\-]"))
vars <- vars[vars!=""] # Remove spurious "" terms
# Build a list of arguments to pass to "order" function
calllist <- list()
pos=1 # Position of + or -
for(i in 1:length(vars)){
varsign <- substring(formc,pos,pos)
pos <- pos+1+nchar(vars[i])
if(is.factor(dat[,vars[i]])){
if(varsign=="-")
calllist[[i]] <- -rank(dat[,vars[i]])
else
calllist[[i]] <- rank(dat[,vars[i]])
}
else {
if(varsign=="-")
calllist[[i]] <- -dat[,vars[i]]
else
calllist[[i]] <- dat[,vars[i]]
}
}
dat[do.call("order",calllist),]
}
Ejemplo:
library(datasets)
sort.data.frame(~len+dose,ToothGrowth)
La función 'arrange' en el paquete' plyr' puede ser de su interés. – joran
Lo es. Desafortunadamente, no parece que admita géneros negativos (hacia atrás), por lo que esta función aún parece ser útil. –
Estoy bastante seguro de que 'arrange' no admite géneros negativos:' arrange (ToothGrowth, desc (dose), len) '. – joran