在 R 中使用带有 ggplot 的 tidyeval 方法
Using tidyeval method with ggplot in R
Hadley Wickham 刚刚创建了新的 dplyr
programming 工具,可用于在 dplyr 动词中将字符串作为函数参数传递。我想知道是否
它也可以与 ggplot 一起使用。
我在尝试什么: 创建一个将分组变量作为输入的自定义函数,生成计数和给定组中行的百分比。这是代码。这里 gprop
是 "group proportion"" 函数。
library(magrittr)
library(dplyr)
gprop <- function(df1,grouping_var,ggp=F){ # ggp = ggplot
grouping_var_enc = enquo(grouping_var)
df2 = df1 %>% group_by(UQ(grouping_var_enc)) %>% tally %>% mutate(`%` = round(100*n/nrow(df1))) %>%
arrange(desc(!!grouping_var_enc)) %>% print
if(ggp){
p_1 = df2 %>% ggplot(aes_string(x = names(df2)[1],y='n')) + geom_bar(stat='identity') + xlab(enquo(grouping_var))
# p_2 = df2 %>% ggplot(aes(x = UQ(grouping_var_enc),y=n)) + geom_bar(stat='identity') + xlab(enquo(grouping_var)) # this does not work
# p_3 = df2 %>% ggplot(aes(x = reorder(grouping_var,-n),y=n)) + geom_bar(stat='identity') + xlab(enquo(grouping_var))
print(p1)
}
}
set.seed(100)
df1 = tibble(a = sample(c('AA','DD','KK'),10,replace = 10),b = rnorm(10)) %>% print
gprop(df1,a,TRUE)
这是输出和绘图。
#R>set.seed(100)
#R>df1 = tibble(a = sample(c('AA','DD','KK'),10,replace = 10),b = rnorm(10)) %>% print
# A tibble: 10 x 2
a b
<chr> <dbl>
1 AA 0.3186300876170320
2 AA -0.5817906847159104
3 DD 0.7145327108915683
4 AA -0.8252594258627688
5 DD -0.3598621313954654
6 DD 0.0898861437775305
7 KK 0.0962744602851301
8 DD -0.2016339521833545
9 DD 0.7398404998784306
10 AA 0.1233795010888694
#R>gprop(df1,a,TRUE)
# A tibble: 3 x 3
a n `%`
<chr> <int> <dbl>
1 KK 1 10
2 DD 5 50
3 AA 4 40
在代码中,p_2
不起作用。 p_1
这是一个黑客作品。有可能使 p_2
工作吗?
此外,由于 p_2
不起作用,我无法在此处添加重新排序(KK 然后 AA 然后 DD)变量,因为我正尝试通过 p_3
进行操作。可能是我想错了方向。可能有一个完全不同的更好的解决方案。
终于在 and here的帮助下找到了答案。下面是代码和情节。我仍然很好奇这是否可以用更好的方式完成。
gprop <- function(df1,grouping_var,ggp=F){ # ggp = ggplot
grouping_var_enc = enquo(grouping_var)
df2 = df1 %>%
group_by(UQ(grouping_var_enc)) %>% tally %>%
mutate(`%` = round(100*n/nrow(df1))) %>%
arrange(desc(!!grouping_var_enc)) %>% print
if(ggp){
p_1 = df2 %>%
ggplot(aes_string(paste0("reorder(",quo_name(grouping_var_enc),",-n)"),y='n')) +
geom_bar(stat='identity') + xlab(enquo(grouping_var))
print(p_1)
}
}
Hadley Wickham 刚刚创建了新的 dplyr
programming 工具,可用于在 dplyr 动词中将字符串作为函数参数传递。我想知道是否
它也可以与 ggplot 一起使用。
我在尝试什么: 创建一个将分组变量作为输入的自定义函数,生成计数和给定组中行的百分比。这是代码。这里 gprop
是 "group proportion"" 函数。
library(magrittr)
library(dplyr)
gprop <- function(df1,grouping_var,ggp=F){ # ggp = ggplot
grouping_var_enc = enquo(grouping_var)
df2 = df1 %>% group_by(UQ(grouping_var_enc)) %>% tally %>% mutate(`%` = round(100*n/nrow(df1))) %>%
arrange(desc(!!grouping_var_enc)) %>% print
if(ggp){
p_1 = df2 %>% ggplot(aes_string(x = names(df2)[1],y='n')) + geom_bar(stat='identity') + xlab(enquo(grouping_var))
# p_2 = df2 %>% ggplot(aes(x = UQ(grouping_var_enc),y=n)) + geom_bar(stat='identity') + xlab(enquo(grouping_var)) # this does not work
# p_3 = df2 %>% ggplot(aes(x = reorder(grouping_var,-n),y=n)) + geom_bar(stat='identity') + xlab(enquo(grouping_var))
print(p1)
}
}
set.seed(100)
df1 = tibble(a = sample(c('AA','DD','KK'),10,replace = 10),b = rnorm(10)) %>% print
gprop(df1,a,TRUE)
这是输出和绘图。
#R>set.seed(100)
#R>df1 = tibble(a = sample(c('AA','DD','KK'),10,replace = 10),b = rnorm(10)) %>% print
# A tibble: 10 x 2
a b
<chr> <dbl>
1 AA 0.3186300876170320
2 AA -0.5817906847159104
3 DD 0.7145327108915683
4 AA -0.8252594258627688
5 DD -0.3598621313954654
6 DD 0.0898861437775305
7 KK 0.0962744602851301
8 DD -0.2016339521833545
9 DD 0.7398404998784306
10 AA 0.1233795010888694
#R>gprop(df1,a,TRUE)
# A tibble: 3 x 3
a n `%`
<chr> <int> <dbl>
1 KK 1 10
2 DD 5 50
3 AA 4 40
在代码中,p_2
不起作用。 p_1
这是一个黑客作品。有可能使 p_2
工作吗?
此外,由于 p_2
不起作用,我无法在此处添加重新排序(KK 然后 AA 然后 DD)变量,因为我正尝试通过 p_3
进行操作。可能是我想错了方向。可能有一个完全不同的更好的解决方案。
终于在
gprop <- function(df1,grouping_var,ggp=F){ # ggp = ggplot
grouping_var_enc = enquo(grouping_var)
df2 = df1 %>%
group_by(UQ(grouping_var_enc)) %>% tally %>%
mutate(`%` = round(100*n/nrow(df1))) %>%
arrange(desc(!!grouping_var_enc)) %>% print
if(ggp){
p_1 = df2 %>%
ggplot(aes_string(paste0("reorder(",quo_name(grouping_var_enc),",-n)"),y='n')) +
geom_bar(stat='identity') + xlab(enquo(grouping_var))
print(p_1)
}
}