假设我有这个 data.frame
:
df = data.frame(strain=c("I","I","R","R"),sex=c("M","F","M","F"),age=c("8d","8d","64d","64d"))
和一个用户提供的
data.frame
定义如何订购 df
.例如:order.df = data.frame(column = c("age","sex","strain"),order = c("+","-","+"))
我想用
arrange
的 plyr
打包订购 df
按照order.df
定义的顺序.如果不是用户提供的,我会这样做:arrange(df, age, desc(sex), strain)
所以我的问题是如何使用 order.df 实现这一目标?或者什么数据结构适合存储用户提供的订单定义,以便它可以与安排一起工作。
最佳答案
这里有两种方法可能会让@hadley 杀死一些小猫......
# make sure that order.df contain character not factors
r <- lapply(order.df, as.character)
# create a list of names refering the columns
rl <- lapply(r[['column']],function(x)list(column = as.name(x)))
# create the appropriate list of arguments
rexp <- unname(Map (f=function(order,column){
cm <- force(column)
if (order =='-'){rn <-substitute(desc(column),cm)} else {
rn <- substitute(column,cm)}
rn
}, order=r[['order']],column = rl))
do.call(arrange, c(alist(df=df),rexp))
# strain sex age
#1 R M 64d
#2 R F 64d
#3 I M 8d
#4 I F 8d
#alternatively, use as.quoted...
fmts <- ifelse(r[['order']]=='-', 'desc(%s)','%s')
rexp2 <- lapply(unname(Map(fmt = fmts, f= sprintf,r[['column']])),
function(x) as.quoted(x)[[1]])
do.call(arrange, c(alist(df=df),rexp2))
# strain sex age
#1 R M 64d
#2 R F 64d
#3 I M 8d
#4 I F 8d
关于r - 用户提供的参数用于使用排列对 data.frame 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520205/