r - 用户提供的参数用于使用排列对 data.frame 进行排序

标签 r plyr

假设我有这个 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("+","-","+"))

我想用 arrangeplyr打包订购 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/

相关文章:

r - 在 R 中使用支持向量机 (SVM) 进行时间序列预测

r - 在不调整 R 的情况下使用 Caret 训练模型

r - 嵌套列表的条件子集

r - 使用空间数据从 ddply 函数内部的多元线性回归 (lm) 中提取 p 值

r - 通过聚合数据帧的列来计算相关性

r - 不同 ggplot2 图中的重复命令

r - 如何在曲线下创建水平渐变?

r - 用聚合解决 ddply 任务的优雅方法(希望有更好的性能)

r - 将模拟泊松分布添加到 ggplot

regex - 在由 "."分隔的字符上通过正则表达式拆分数据框列