我正面临一个挑战,我似乎无法弄清楚(也在搜索 www 之后)。
给定一个数据框:
diabetes <- data.frame(Age = c(20,23,45,77), Diabetes = c('no', 'no', 'yes', 'yes'))
$ Age <dbl> 20, 23, 45, 77
$ Diabetes <fct> no, no, yes, yes
我正在尝试绘制两种糖尿病结果的密度曲线,并在平均值处包括垂直线。
plot_numeric <- function(dataset, predictor, outcome){
p1 <- dataset %>% ggplot(aes_string(x = predictor)) +
geom_density(fill = 'gray', alpha = 0.5) +
theme_fivethirtyeight()
p2 <- dataset %>% ggplot(aes_string(x = predictor, fill = outcome)) +
geom_density(alpha = 0.5) +
scale_fill_manual(values = c('#999999', '#E69F00')) +
geom_vline(aes_string(xintercept = mean(predictor[outcome == 'no'])), color = '999999') +
geom_vline(aes_string(xintercept = mean(predictor[outcome == 'yes'])), color = '#E69F00') +
theme_fivethirtyeight()
gridExtra::grid.arrange(p1,p2)
}
plot_numeric(diabetes, 'Age', 'Diabetes')
我收到错误“参数不是数字或逻辑:返回 NA”并且不包括平均值的垂直线。
在函数外进行绘图时,一切正常。
关于如何解决这个问题的任何想法,非常感谢。
aes_string()
不再推荐该函数,而是鼓励人们按照小插图使用整洁的评估语法。
在您的情况下,mean(predictor[outcome == 'no']))
尝试计算由长度为 1 的predictor
字符划分的长度为 1 的字符的平均值outcome
。
修复 的缺点aes_string()
,可以使用大括号。
library(ggplot2)
library(magrittr)
diabetes <- data.frame(Age = c(20,23,45,77), Diabetes = c('no', 'no', 'yes', 'yes'))
plot_numeric <- function(dataset, predictor, outcome){
p1 <- dataset %>% ggplot(aes(x = {{predictor}})) +
geom_density(fill = 'gray', alpha = 0.5)
p2 <- dataset %>% ggplot(aes(x = {{predictor}}, fill = {{outcome}})) +
geom_density(alpha = 0.5) +
scale_fill_manual(values = c('#999999', '#E69F00')) +
geom_vline(
aes(xintercept = mean({{predictor}}[{{outcome}} == 'no'])),
color = '999999'
) +
geom_vline(
aes(xintercept = mean({{predictor}}[{{outcome}} == 'yes'])),
color = '#E69F00'
)
gridExtra::grid.arrange(p1,p2)
}
plot_numeric(diabetes, Age, Diabetes)
由reprex 包(v2.0.1)于 2021 年 9 月 21 日创建
或者,如果您想将列名作为字符串,可以使用.data
代词:
library(ggplot2)
library(magrittr)
diabetes <- data.frame(Age = c(20,23,45,77), Diabetes = c('no', 'no', 'yes', 'yes'))
plot_numeric <- function(dataset, predictor, outcome){
p1 <- dataset %>% ggplot(aes(x = .data[[predictor]])) +
geom_density(fill = 'gray', alpha = 0.5)
p2 <- dataset %>% ggplot(aes(x = .data[[predictor]], fill = .data[[outcome]])) +
geom_density(alpha = 0.5) +
scale_fill_manual(values = c('#999999', '#E69F00')) +
geom_vline(
aes(xintercept = mean(.data[[predictor]][.data[[outcome]] == 'no'])),
color = '999999'
) +
geom_vline(
aes(xintercept = mean(.data[[predictor]][.data[[outcome]] == 'yes'])),
color = '#E69F00'
)
gridExtra::grid.arrange(p1,p2)
}
plot_numeric(diabetes, "Age", "Diabetes")
由reprex 包(v2.0.1)于 2021 年 9 月 21 日创建
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句