【发布时间】:2018-04-23 20:32:29
【问题描述】:
在阅读和重新阅读许多“使用 dplyr 编程”指南之后,我仍然找不到解决我的特殊情况的方法。
我知道使用 group_by_、mutate_ 和这种“字符串友好”版本的 tidyverse 函数正在走向弃用,而 enquo 是要走的路。
但是,我的情况有些不同,我正在努力寻找一种整洁的方式来解决它。
确实,我的目标是在函数中创建和操作数据框。根据其他变量创建(mutating)新变量,使用它们等。
但是,无论我多么努力,我的代码要么出错,要么在检查包时返回一些警告,例如no visible binding for global variable ...。
这是一个可重现的示例:
这是我想做的:
df <- data.frame(X=c("A", "B", "C", "D", "E"),
Y=c(1, 2, 3, 1, 1))
new_df <- df %>%
group_by(Y) %>%
summarise(N=n()) %>%
mutate(Y=factor(Y, levels=1:5)) %>%
complete(Y, fill=list(N = 0)) %>%
arrange(Y) %>%
rename(newY=Y) %>%
mutate(Y=as.integer(newY))
一些常见的 dplyr 操作,预期结果应该是:
# A tibble: 5 x 3
newY N Y
<fctr> <dbl> <int>
1 1 3 1
2 2 1 2
3 3 1 3
4 4 0 4
5 5 0 5
我希望这段代码能够在内部一个函数中安静地工作。以下是我处理非 NSE 问题的最佳尝试:
myfunction <- function(){
df <- data.frame(X=c("A", "B", "C", "D", "E"),
Y=c(1, 2, 3, 1, 1))
new_df <- df %>%
group_by_("Y") %>%
summarise(!!"N":=n()) %>%
mutate(!!"Y":=factor(Y, levels=1:5)) %>%
complete_("Y", fill=list(N = 0)) %>%
arrange_("Y") %>%
rename(!!"newY":="Y") %>%
mutate(!!"Y":=as.integer(newY))
}
很遗憾,我仍然收到以下消息:
myfunction: no visible global function definition for ':='
myfunction: no visible binding for global variable 'Y'
myfunction: no visible binding for global variable 'newY'
Undefined global functions or variables:
:= Y n.Factors n_optimal newY
有办法解决吗?非常感谢!
编辑:我正在使用 R 3.4.1、dplyr_0.7.4、tidyr_0.7.2 和 tidyverse_1.1.1
回答
感谢我设法解决的 cmets,这是可行的解决方案:
myfunction <- function(){
df <- data.frame(X=c("A", "B", "C", "D", "E"),
Y=c(1, 2, 3, 1, 1))
new_df <- df %>%
group_by_("Y") %>%
summarise_("N"=~n()) %>%
mutate_("Y"= ~factor(Y, levels=1:5)) %>%
complete_("Y", fill=list(N = 0)) %>%
arrange_("Y") %>%
rename_("newY"=~Y) %>%
mutate_("Y"=~as.integer(newY))
}
非常感谢:)
【问题讨论】:
-
您使用的是哪个版本的
dplyr?你加载的是library(tyidyverse)还是library(rlang)?运行代码时,我没有遇到与您相同的错误。分享来自sessionInfo()的信息,说明您正在运行哪些软件包和版本。在你的新函数中究竟需要参数化什么? -
我确实在开始时加载了 tidyverse(我已经编辑了我的问题以添加版本)。 “什么需要参数化”是什么意思?
-
现在你的函数似乎根本不需要任何花哨的 NSE 东西。所以您希望能够将“Y”和“N”以及变量传递给函数或其他东西?您使用字符串的原因是什么?到底要怎么调用函数?
-
好的,所以我正在开发一个从分析中提取一些值的函数,将其转换为基本数据框(我的示例中的
df)。然后,我执行这些确切的步骤(如示例所示)以获得一个新的数据框。后来,我将这个数据框重新用于其他计算、绘图和其他东西。我的意思是函数有效,但困扰我的是我在构建包时收到的警告,因为它阻止了 CRAN 发布:(