W końcu zdecydowałem się umieścić metodę sort.data.frame, która pływa w Internecie w pakiecie R. Za bardzo żąda się, aby zostawić ją na ad hoc.Najlepszy sposób tworzenia spójności ogólnej/metody dla sort.data.frame?
Jednak on napisany z argumentami, które sprawiają, że jest niezgodna z ogólną funkcję sortowania:
sort(x,decreasing,...)
sort.data.frame(form,dat)
jeśli zmienię sort.data.frame
wziąć maleje jako argument jak w sort.data.frame(form,decreasing,dat)
i wyrzucić maleje, wówczas traci swoją prostotą, ponieważ zawsze będziesz musiał podać dat=
i nie możesz naprawdę używać argumentów pozycyjnych. Jeśli dodaję go do końca, jak w przypadku sort.data.frame(form,dat,decreasing)
, kolejność nie jest zgodna z funkcją ogólną. Jeśli mam nadzieję, że zmniejszenie zostanie uwikłane w kropki `sort.data.frame (forma, dat, ...), to podczas używania dopasowania opartego na pozycji uważam, że funkcja ogólna przypisuje drugiemu położeniu obniżenie i otrzyma odrzucona. Jaki jest najlepszy sposób na zharmonizowanie tych dwóch funkcji?
Pełne funkcja:
# 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),]
}
przykład:
library(datasets)
sort.data.frame(~len+dose,ToothGrowth)
Funkcja 'arran' w pakiecie' plyr' może być przedmiotem zainteresowania. – joran
To jest. Niestety nie wygląda na to, że obsługuje sortowanie negatywne (do tyłu), więc ta funkcja wciąż wydaje się przydatna. –
Jestem dość pewny, że 'zorganizuj' obsługuje typy negatywne:' aranżuj (ToothGrowth, desc (dose), len) '. – joran