Пользовательская функция построения графика не находит существующие столбцы

Я написал быструю функцию для построения демографических данных, но она не распознает выбранную мной переменную. Я знаю, что 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")

ETA: Спасибо за все ваши предложения и ресурсы. Я обнаружил, что с минимальной модификацией моей функции работало следующее:

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")

person carousallie    schedule 21.11.2019    source источник
comment
Вы пробовали использовать в своей функции "poverty_rate" вместо poverty_rate?   -  person dc37    schedule 21.11.2019
comment
Вы должны предоставить воспроизводимый пример   -  person M--    schedule 21.11.2019
comment
@ dc37 Я пробовал бедность_рейт, но там было argument is not numeric or logical: returning NA.   -  person carousallie    schedule 21.11.2019
comment
Это проблема передачи имен динамических столбцов функциям в tidyverse. Некоторая информация здесь, здесь и здесь.   -  person ravic_    schedule 21.11.2019


Ответы (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)"))))

скорее всего не похож на ваш сюжет lol

person StupidWolf    schedule 21.11.2019
comment
на самом деле, использование mutate(avg_var=mean(demog, na.rm = T)) вместо mutate(avg_var=eval(parse(text=paste("mean(",demog,",na.rm=TRUE)")))) работает для меня - person bretauv; 21.11.2019
comment
да, вы правы, @bretauv, я перепутал 2 версии кода. Спасибо за орлиные глаза :) тут темнеет - person StupidWolf; 21.11.2019