这里相当新的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
要明确的是,我使用此函数的目标是使用部分字符串匹配过滤数据集,并在感兴趣的列上对结果进行排序。
答案 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)