使用自定义函数内的dplyr arrange()函数对修改过的数据帧进行排序

时间:2016-07-26 15:10:21

标签: r sorting dplyr

这里相当新的R用户,刚刚进入更先进的材料。我正在编写一个简单的函数,它利用了dplyr包中的arrange函数。该函数打算使用部分字符串匹配过滤数据帧,然后在' sortby'指定的列上对结果进行排序。函数中的参数。以下是我到目前为止的情况:

calcs <- function(data, type, sortby) {
filt <- data[grep(type, data$name), ]
ord <- dplyr::arrange(filt, desc(sortby))
return(ord)
}

评估时未找到sortby变量。我猜测它与标准和非标准评估有关,但这有点超出了我的编程能力。

这是一个可重复的例子:

mydata <- data.frame(name=c("GI Joe", "GI Joe", "Batman", "Xbox"),
                     rating=c(8,12,8,1))

calcs(data=mydata, type="GI", sortby=rating)

Error in desc(sortby) : object 'rating' not found

要明确的是,我使用此函数的目标是使用部分字符串匹配过滤数据集,并在感兴趣的列上对结果进行排序。

2 个答案:

答案 0 :(得分:0)

您应该重写您的函数以使用NSE。关于NSE的使用,请参阅this post并查看vignette('nse')中的R

calcs <- function(data, type, sortby) {
    sorting <- paste0('desc(', sortby, ')') #nse
    filt <- data[grep(type, data$name),]
    ord <- dplyr::arrange_(filt, .dots = sorting) #use arrange_
    return(ord)
}

mydata <- data.frame(name = c("GI Joe", "GI Joe", "Batman", "Xbox"),
                     rating = c(8,12,8,1))

calcs(data = mydata, type = "GI", sortby = 'rating')

    name rating
1 GI Joe     12
2 GI Joe      8

答案 1 :(得分:0)

tidyverse软件包的功能有所变化。无需使用arrange_(),而需要添加一行来转换对象。请参阅编程小插图:

https://tidyeval.tidyverse.org/sec-up-to-speed.html

在该插图中,他们有以下示例如何在程序包中包含dplyr()函数的列名:

grouped_mean <- function(data, group_var, summary_var) {
  group_var <- enquo(group_var)
  summary_var <- enquo(summary_var)

  data %>%
    group_by(!!group_var) %>%
    summarise(mean = mean(!!summary_var))
}

grouped_mean(mtcars, cyl, mpg)