gpt4 book ai didi

class - 为 sort.data.frame 创建通用/方法一致性的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 06:26:08 25 4
gpt4 key购买 nike

我终于决定将互联网上流传的 sort.data.frame 方法放入 R 包中。它只是被要求太多,不能留给一种临时的分发方法。

但是,它使用的参数使其与通用排序函数不兼容:

sort(x,decreasing,...)
sort.data.frame(form,dat)

如果我改变 sort.data.frame以递减作为参数,如 sort.data.frame(form,decreasing,dat)并丢弃递减,那么它就失去了它的简单性,因为你总是必须指定 dat=并且不能真正使用位置参数。如果我将它添加到末尾,如 sort.data.frame(form,dat,decreasing) ,则顺序与泛型函数不匹配。如果我希望递减在点`sort.data.frame(form,dat,...)中被捕获,那么当使用基于位置的匹配时,我相信通用函数会将第二个位置分配给递减并且它会得到丢弃。协调这两个功能的最佳方法是什么?

完整的功能是:
# 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),]
}

例子:
library(datasets)
sort.data.frame(~len+dose,ToothGrowth)

最佳答案

使用 arrange plyr中的函数.它允许您单独选择哪些变量应该按升序和降序排列:

arrange(ToothGrowth, len, dose)
arrange(ToothGrowth, desc(len), dose)
arrange(ToothGrowth, len, desc(dose))
arrange(ToothGrowth, desc(len), desc(dose))

它还有一个优雅的实现:
arrange <- function (df, ...) {
ord <- eval(substitute(order(...)), df, parent.frame())
unrowname(df[ord, ])
}

desc只是一个普通的功能:
desc <- function (x) -xtfrm(x)

阅读 xtfrm 的帮助如果您正在编写此类函数,强烈建议您使用。

关于class - 为 sort.data.frame 创建通用/方法一致性的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6836963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com