【问题标题】:Custom plotting function not finding existing columns [duplicate]自定义绘图功能未找到现有列[重复]
【发布时间】:2020-03-17 20:07:33
【问题描述】:

我编写了一个快速函数来绘制一些人口统计数据,但它无法识别我选择的变量。我知道poverty_rate 是我的数据框中的一列,当我执行names(df) 时它会显示出来,并且我已经在之前的块中使用过它。是的,当我运行下面的函数时,我得到Error in mean(demog, na.rm = TRUE) : object 'poverty_rate' not found。我做错了什么?

dense_plot_demos <- function(df, id_list, demog, color_id, demo_name, qual) {
  df %>%
  filter(GEOID %in% id_list) %>%
  group_by(GEOID) %>%
  mutate(avg_var = mean(demog, na.rm=TRUE)) %>%
  ggplot(aes(x=avg_var)) + 
  geom_histogram(aes(y=..density..), color="black", fill="white", bins=20) + 
  geom_density(alpha=.5, fill=color_id) + 
  theme_bw() + 
  xlab(demo_name) + 
  ylab("Density") + 
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title = paste(demo_name, "in", qual, "Filing Counties"))
}
top_pov <- dense_plot_demos(df, top_ids, poverty_rate, color_pal[1], "Poverty Rate", "Highest")

预计到达时间:感谢您提供的所有建议和资源。我发现以下内容对我的功能进行了最小的修改:

dense_plot_demos <- function(df, id_list, demog, color_id, demo_name, qual) {
  demog <- sym(demog)
  df %>%
  filter(GEOID %in% id_list) %>%
  group_by(GEOID) %>%
  mutate(avg = (mean(!! demog, na.rm=TRUE))) %>%
  ggplot(aes(x=avg)) + 
  geom_histogram(aes(y=..density..), color="black", fill="white", bins=20) + 
  geom_density(alpha=.5, fill=color_id) + 
  theme_bw() + 
  xlab(demo_name) + 
  ylab("Density") + 
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title = paste(demo_name, "in", qual, "Filing Counties"))
}

top_pov <- dense_plot_demos(ecplot, top_lists, "poverty_rate", color_pal[1], "Poverty Rate", "Highest")

【问题讨论】:

  • 您是否尝试使用 "poverty_rate" 而不是 poverty_rate 来提供您的功能?
  • 您应该提供reproducible example
  • @dc37 我试过“poverty_rate”,但它说的是argument is not numeric or logical: returning NA
  • 这是将动态列名传递给 tidyverse 中的函数的问题。一些信息hereherehere

标签: r ggplot2 dplyr


【解决方案1】:

您好 carousallie,@camille,@ravic_ 的建议可以解决您的问题。要点是正确评估mean(demog, na.rm=TRUE)。对于您编写的代码,您可以通过创建一个名为 demog 的虚拟列来快速修复,它是您的 demog 变量的复制:

dense_plot_demos <- function(df, id_list, demog, color_id, demo_name, qual) {

  #add this line
  df$demog <- df[,demog]
  df %>%
  filter(GEOID %in% id_list) %>%
  group_by(GEOID) %>%
  mutate(avg_var = mean(demog, na.rm=TRUE)) %>%
  ggplot(aes(x=avg_var)) + 
  geom_histogram(aes(y=..density..), color="black", fill="white", bins=20) + 
  geom_density(alpha=.5, fill=color_id) + 
  theme_bw() + 
  xlab(demo_name) + 
  ylab("Density") + 
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title = paste(demo_name, "in", qual, "Filing Counties"))
}

#simulate data
set.seed(100)
df <- data.frame(
GEOID = sample(letters,300,replace=TRUE),
poverty_rate = rnorm(300)
)
# some values for your other input
top_ids = letters[1:10]
color_pal = "lightblue"
# plot, this works
# note use "poverty_rate" as demog
top_pov <- dense_plot_demos(df, top_ids, 
"poverty_rate", color_pal[1], "Poverty Rate", "Highest")

上述方法有效,因为您的数据框中没有名为“demog”的列(我希望如此),因此您的后续代码可以正常运行。

如果你想真正让它在没有假人的情况下工作,那么将 mutate 部分更改为:

mutate(avg_var=eval(parse(text=paste("mean(",demog,",na.rm=TRUE)"))))

【讨论】:

  • 实际上,使用 mutate(avg_var=mean(demog, na.rm = T)) 而不是 mutate(avg_var=eval(parse(text=paste("mean(",demog,",na.rm=TRUE)")))) 对我有用
  • 是的,你是对的,@bretauv 我混淆了 2 个版本的代码。谢谢你的鹰眼:)这里变黑了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多