在函数NSE中按dplyr分组
在管道函数调用中使用在函数NSE中按dplyr分组,r,function,dplyr,R,Function,Dplyr,在管道函数调用中使用dplyr和groupby时遇到问题 可复制示例: outside_result<- ex_data %>% mutate(word2=reorder(word2,contribution)) %>% group_by(word1) %>% top_n(10,abs(contribution)) %>% group_by(word1,word2) %>% arrange(desc(contribution))
dplyr
和groupby
时遇到问题
可复制示例:
outside_result<- ex_data %>%
mutate(word2=reorder(word2,contribution)) %>%
group_by(word1) %>%
top_n(10,abs(contribution)) %>%
group_by(word1,word2) %>%
arrange(desc(contribution)) %>%
ungroup() %>%
mutate(word2 = factor(paste(word2,word1, sep = "__"),
levels=rev(paste(word2,word1,sep="__"))))
order_bars <- function(df,facetPanel,barCategory,value){
df %>% mutate(barCategory=reorder(barCategory,value)) %>%
group_by(facetPanel) %>%
top_n(10,abs(value)) %>%
group_by(facetPanel,barCategory) %>%
arrange(desc(value)) %>%
ungroup() %>%
mutate(barCategory = factor(paste(barCategory,facetPanel, sep = "__"),
levels=rev(paste(barCategory,facetPanel,sep="__"))))
}
使用以下数据:
ex_data<- structure(list(word1 = c("no", "not", "not", "no", "not", "not",
"not", "not", "no", "not", "no", "not", "not", "not", "no", "not",
"no", "no", "not", "not", "not", "no", "not", "without", "never",
"no", "not", "no", "no", "not", "not", "not", "no", "no", "no",
"not", "not", "without", "never", "no", "not", "not", "not",
"not", "not", "never", "no", "no", "not", "not"), word2 = c("doubt",
"like", "help", "no", "want", "wish", "allow", "care", "harm",
"sorry", "great", "leave", "pretend", "worth", "pleasure", "love",
"danger", "want", "afraid", "doubt", "fail", "good", "forget",
"feeling", "forget", "matter", "avoid", "chance", "hope", "forgotten",
"miss", "perfectly", "bad", "better", "opportunity", "admit",
"fair", "delay", "failed", "wish", "dislike", "distress", "refuse",
"regret", "trust", "want", "evil", "greater", "better", "blame"
), score = c(-1L, 2L, 2L, -1L, 1L, 1L, 1L, 2L, -2L, -1L, 3L,
-1L, -1L, 2L, 3L, 3L, -2L, 1L, -2L, -1L, -2L, 3L, -1L, 1L, -1L,
1L, -1L, 2L, 2L, -1L, -2L, 3L, -3L, 2L, 2L, -1L, 2L, -1L, -2L,
1L, -2L, -2L, -2L, -2L, 1L, 1L, -3L, 3L, 2L, -2L), n = c(102L,
99L, 82L, 60L, 45L, 39L, 36L, 23L, 22L, 21L, 19L, 18L, 18L, 17L,
16L, 16L, 15L, 15L, 15L, 14L, 14L, 13L, 13L, 13L, 12L, 12L, 12L,
11L, 11L, 10L, 10L, 10L, 9L, 9L, 9L, 9L, 9L, 9L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 7L, 7L, 7L, 7L, 7L), contribution = c(-102L,
198L, 164L, -60L, 45L, 39L, 36L, 46L, -44L, -21L, 57L, -18L,
-18L, 34L, 48L, 48L, -30L, 15L, -30L, -14L, -28L, 39L, -13L,
13L, -12L, 12L, -12L, 22L, 22L, -10L, -20L, 30L, -27L, 18L, 18L,
-9L, 18L, -9L, -16L, 8L, -16L, -16L, -16L, -16L, 8L, 7L, -21L,
21L, 14L, -14L)), .Names = c("word1", "word2", "score", "n",
"contribution"), row.names = c(NA, -50L), class = c("tbl_df",
"tbl", "data.frame"))
R抛出以下错误:
Error: unknown variable to group by : facetPanel
Called from: resolve_vars(new_groups, tbl_vars(.data))
我怀疑需要调整
groupby
以获取命名变量,或者我必须使用.dot
符号来引用列,虽然我只是想把它抛在脑后…你需要学习如何使用1)SE版本的dplyr
动词,如groupby\uuu
和mutate\uu
和2)神秘的lazyeval::interp
。请仔细阅读vignette(“nse”)
然后我们可以得出:
order_bars <- function(df, facetPanel, barCategory, value){
require(lazyeval)
df %>%
mutate_(barCategory = interp(~reorder(x, y), x = as.name(barCategory),
y = as.name(value))) %>%
group_by_(facetPanel) %>%
filter_(interp(~min_rank(desc(abs(x))) <= 10, x = as.name(value))) %>%
group_by_(facetPanel, barCategory) %>%
arrange_(interp(~desc(x), x = as.name(value))) %>%
ungroup() %>%
mutate_(barCategory = interp(
~factor(paste(x, y, sep = "__"), levels = rev(paste(x, y, sep = "__"))),
x = as.name(barCategory), y = as.name(facetPanel)))
}
order_bars(ex_data, 'word1', 'word2', 'contribution')
理想情况下,您应该只完整地编写SE版本,并使用
lazyeval
将NSE版本链接到SE版本。我将把它作为一个练习留给读者。对于rlang_0.4.0
和dplyr_0.8.2
,我们可以使用整洁的求值操作符({…})或curly-curly,它将引号和unquote抽象为一个插值步骤
library(rlang)
library(dplyr)
order_barsN <- function(df, facetPanel, barCategory, value) {
df %>%
mutate(barCategory = reorder({{barCategory}}, {{value}}))%>%
group_by({{facetPanel}}) %>%
filter(min_rank(desc(abs({{value}}))) <= 10) %>%
group_by({{facetPanel}}, {{barCategory}}) %>%
arrange(desc({{value}})) %>%
ungroup %>%
mutate(barCategory = factor(str_c({{barCategory}}, {{facetPanel}}, sep="__"),
levels = rev(str_c({{barCategory}}, {{facetPanel}}, sep="__"))))
}
out2 <- order_barsN(ex_data, word1, word2, contribution)
库(rlang)
图书馆(dplyr)
订单数量%
mutate(barCategory=重新排序({{barCategory},{{value}}))%>%
分组依据({facetPanel}})%>%
过滤器(最小秩(desc(abs({{value})))%
分组依据({facetPanel},{{barCategory}})%>%
排列(desc({value}}))%>%
解组%>%
mutate(barCategory=factor(str_c({{barCategory}},{{facetPanel}},sep=“{uu”),
levels=rev(str_c({{barCategory},{{{facetPanel}},sep=“u”))
}
out2这是我第一次遇到SE,这是一个很好的学习机会…谢谢你的指导!awwww很好的回答axeman但是伙计,SE评估的东西是horrible@Noobie是的,在我看来,一个人用丑陋来为NSE的美丽买单在使用tidyverse时使用SE。此行为已被更改。“dplyr现在使用tidy求值语义。NSE谓词仍然捕获其参数,但您现在可以取消这些参数的部分引用。这提供了NSE谓词的完全可编程性。因此,带下划线的版本现在是多余的。”请参阅
# A tibble: 25 × 6
word1 word2 score n contribution barCategory
<chr> <chr> <int> <int> <int> <fctr>
1 not like 2 99 198 like__not
2 not help 2 82 164 help__not
3 no great 3 19 57 great__no
4 no pleasure 3 16 48 pleasure__no
5 not love 3 16 48 love__not
6 not care 2 23 46 care__not
7 not want 1 45 45 want__not
8 not wish 1 39 39 wish__not
9 no good 3 13 39 good__no
10 not allow 1 36 36 allow__not
order_bars <- function(df,facetPanel,barCategory,value){
facetPanel <- substitute(facetPanel)
barCategory <- substitute(barCategory)
value <- substitute(value)
require(lazyeval)
df %>%
mutate_(barCategory = interp(~reorder(x, y), x = barCategory, y = value)) %>%
group_by_(facetPanel) %>%
filter_(interp(~min_rank(desc(abs(x))) <= 10, x = value)) %>%
group_by_(facetPanel, barCategory) %>%
arrange_(interp(~desc(x), x = value)) %>%
ungroup() %>%
mutate_(barCategory = interp(
~factor(paste(x, y, sep = "__"), levels = rev(paste(x, y, sep = "__"))),
x = barCategory, y = facetPanel))
}
order_bars(ex_data, word1, word2, contribution)
library(rlang)
library(dplyr)
order_barsN <- function(df, facetPanel, barCategory, value) {
df %>%
mutate(barCategory = reorder({{barCategory}}, {{value}}))%>%
group_by({{facetPanel}}) %>%
filter(min_rank(desc(abs({{value}}))) <= 10) %>%
group_by({{facetPanel}}, {{barCategory}}) %>%
arrange(desc({{value}})) %>%
ungroup %>%
mutate(barCategory = factor(str_c({{barCategory}}, {{facetPanel}}, sep="__"),
levels = rev(str_c({{barCategory}}, {{facetPanel}}, sep="__"))))
}
out2 <- order_barsN(ex_data, word1, word2, contribution)
out1 <- order_bars(ex_data, word1, word2, contribution)
identical(out1, out2)
#[1] TRUE