使用R 3.2.2和dplyr 0.7.2我试图弄清楚如何有效地使用group_by作为字符向量提供的字段。
选择很容易我可以通过这样的字符串选择一个字段
(function(field) {
mpg %>% dplyr::select(field)
})("cyl")
Run Code Online (Sandbox Code Playgroud)
通过像这样的多个字符串的多个字段
(function(...) {
mpg %>% dplyr::select(!!!quos(...))
})("cyl", "hwy")
Run Code Online (Sandbox Code Playgroud)
和多个字段,通过一个长度 > 1 的字符向量,像这样
(function(fields) {
mpg %>% dplyr::select(fields)
})(c("cyl", "hwy"))
Run Code Online (Sandbox Code Playgroud)
随着group_by我真的不能找到一种方法,因为如果我设法得到一个输出它结束了由字符串我供应分组为多个字符串做到这一点。
我设法按这样的一个字符串分组
(function(field) {
mpg %>% group_by(!!field := .data[[field]]) %>% tally()
})("cyl")
Run Code Online (Sandbox Code Playgroud)
这已经很丑了。
有谁知道我必须写什么,以便我可以运行
(function(field) {...})("cyl", "hwy")
Run Code Online (Sandbox Code Playgroud)
和
(function(field) {...})(c("cyl", "hwy"))
Run Code Online (Sandbox Code Playgroud)
分别?我试过各种组合!!,!!!,UQ,enquo,quos,unlist,等...,并将其保存在中间变量,因为,有时似乎有所作为,但它不能去工作。
我正在尝试使用dplyr的新NSE语言方法来创建条件变异,使用矢量输入.我遇到麻烦的地方是将列设置为等于它自己,请参见下面的mwe:
df <- data.frame("Name" = c(rep("A", 3), rep("B", 3), rep("C", 4)),
"X" = runif(1:10),
"Y" = runif(1:10)) %>%
tbl_df() %>%
mutate_if(is.factor, as.character)
ColToChange <- "Name"
ToChangeTo <- "Big"
Run Code Online (Sandbox Code Playgroud)
现在,使用以下内容:
df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, !!ColToChange))
Run Code Online (Sandbox Code Playgroud)
将ColToChange值设置为Name,而不是回到其原始值.我因此尝试使用上面的语法来实现这一点:
df %>% mutate( !!ColToChange := ifelse(X >= 0.5 & Y >= 0.5, ToChangeTo, Name))
Run Code Online (Sandbox Code Playgroud)
但不是Name,它是矢量.
我编写了一个函数,可以进行一些分析,包括使用NPS包计算一个名为"Net Promoter Score"的度量.
library(dplyr)
library(tidyr)
library(NPS)
df<-data.frame(score = sample(c(0:10),15,replace=TRUE),
variable = sample(c('A', 'B', 'C'),15,replace=TRUE)
)
analyzer <- function(df,var, sco){
df %>% group_by_(var) %>% transmute(n= nps(sco)) %>% unique()
}
analyzer(df,'variable','score')
Run Code Online (Sandbox Code Playgroud)
这将返回NA所有级别的变量.
现在dplyr函数有一种处理x作为字符传递给它们的方法(即,_我在这里使用它们的版本),但nps函数没有.我也试过通过得分列,nps(.[[score]])但这会返回整列的NPS,并且不会按group_by级别将其分解.
sym/ enquo将列范围传递给dplyr::select?考虑以下带有A至E列的标题:
library(tibble)
library(dplyr)
set.seed(4)
d = as_tibble(setNames(as.list(rnorm(5)), LETTERS[1:5]))
d
## # A tibble: 1 x 5
## A B C D E
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.217 -0.542 0.891 0.596 1.64
Run Code Online (Sandbox Code Playgroud)
我可以使用列运算符选择列的范围:,例如
select(d, B:D)
## # A tibble: 1 x 3
## B C D
## <dbl> <dbl> <dbl>
## 1 -0.542 0.891 0.596
Run Code Online (Sandbox Code Playgroud)
我什至可以通过这个范围作为保证:
cols = quo(B:D)
select(d, !!cols)
# same result as above …Run Code Online (Sandbox Code Playgroud) 我在新data.table
如何让同样的事情data.table用rlang?
library(tidyverse)
library(data.table)
gr <- "Species"
col <- "Petal.Length"
iris %>%
group_by(!!rlang::sym(gr)) %>%
summarise_at(vars(!!rlang::sym(col)),sum)
iris1 <- iris
setDT(iris1)
iris1[,sum(!!rlang::sym(col)),by=!!rlang::sym(gr)]
Run Code Online (Sandbox Code Playgroud)