Имя переменной в качестве аргумента в функции — ggplot R

#r #dplyr

Вопрос:

Я хочу построить график, который показывает, что продается относительно переменной, которая расскажет мне больше о компании. Мне нужен другой сюжет для каждого вида продукта( например, для всех видов фруктов: яблок, бананов). Далее я хочу упростить создание этих графиков и для других переменных компании.

У меня есть рабочий код для одной переменной, но не для функции. Он не принимает аргумент так, как должен. Я знаю, что это как-то связано с нестандартной оценкой, но мне не удается решить проблему.

 MASTERDATA%>%
  group_by(COMPANY)%>%
  summarize(AMOUNT_COMP = (sum(AMOUNT, na.rm=TRUE)),
            Type=Type,
            COMP_VAR1=COMP_VAR1)%>%
  filter(!is.na(Type)) %>%
  ggplot(aes(COMP_VAR1,AMOUNT_COMP ), na.rm = TRUE) 
  geom_point() 
  facet_wrap(~Type,nrow=4)

 

Следующий код для функции

 plot_var_aantal<-function(vari){
eval(substitute(vari), MASTERDATA)
MASTERDATA%>%
  group_by(COMPANY)%>%
  summarize(AMOUNT_COMP = (sum(AMOUNT, na.rm=TRUE)),
            Type=Type,
            vari=vari)%>%
  filter(!is.na(Type)) %>%
  ggplot(aes(vari,AMOUNT_COMP ), na.rm = TRUE) 
  geom_point() 
  facet_wrap(~Type,nrow=4)

}
 

Если я, например, поставлю plot_var_aantal(«люди») Я получаю только слово «люди» по оси x со всеми точками на прямой линии над ним.

ПРИМЕР ДАННЫХ

Productnr Тип Сумма Компания COMP_VAR1 COMP_VAR2
1 Apple 29 Компания 1 2 45
1 Груша 271 Компания 2 2 45
3 Apple 565 Компания 2 5 78
2 Банан 354 Компания 2 12 36
2 Груша 984 Компания 3 12 36
1 Банан 247 Компания 3 2 45

Комментарии:

1. Пожалуйста, поделитесь небольшим примером использования ваших данных dput(head(MASTERDATA)) .

2. Не уверен, что вы пытаетесь сделать. Возможно, замена vari = vari на {{ vari }} := vari решит вашу проблему. vari внутри также aes() должны быть завитые-завитые.

3. Почему у вас есть Type=Type и vari=vari в summarise ? Что они должны делать?

4. @RonakShah Я использую их там, потому что обнаружил, что в противном случае у меня больше нет этих переменных для работы в последующих строках. Например, построить график или отфильтровать.

5. Если эти переменные одинаковы во всем, возможно, вам нужно включить их в group_by или вместо них использовать одинаковое количество строк mutate summarise .

Ответ №1:

Если вы вызываете plot_var_aantal со строкой, подобной "people" той, которую вам нужно вычислить vari как символ с правой стороны !!sym(vari) и с левой стороны, вам нужно поместить ее в glue спецификацию "{vari}" . Следующий код должен работать:

 plot_var_aantal<-function(vari){
  eval(substitute(vari), MASTERDATA)
  MASTERDATA%>%
    group_by(COMPANY)%>%
    summarize(AMOUNT_COMP = (sum(AMOUNT, na.rm=TRUE)),
              Type=Type,
              "{vari}" := !!sym(vari)) %>% # changed this line 
    filter(!is.na(Type)) %>%
    ggplot(aes(!! sym(vari),AMOUNT_COMP ), na.rm = TRUE)   # changed this line
    geom_point() 
    facet_wrap(~Type,nrow=4)
  
}
 

Однако, не видя ваших данных, трудно понять, что COMP_VAR1 = COMP_VAR1 происходит в вашем dplyr::summarise звонке. Вы не используете агрегирующую функцию (например mean , или paste(..., collapse = ",") ), поэтому целое summarise , вероятно, не суммирует, а возвращает данные в исходной длине. Аналогично, строка "{vari}" := !!sym(vari) , похоже, не имеет смысла (хотя нестандартная оценка, когда vari это строка, верна).

Ответ №2:

При передаче имен столбцов в виде строки вы можете использовать .data местоимение.

 library(dplyr)
library(ggplot2)

plot_var_aantal<-function(vari){
  MASTERDATA%>%
    group_by(COMPANY)%>%
    summarize(AMOUNT_COMP = (sum(AMOUNT, na.rm=TRUE)),
              Type=Type,
              !!vari := .data[[vari]])%>%
    filter(!is.na(Type)) %>%
    ggplot(aes(.data[[vari]],AMOUNT_COMP), na.rm = TRUE) 
    geom_point() 
    facet_wrap(~Type,nrow=4)
}

plot_var_aantal("people")
 

Ответ №3:

Вы можете либо использовать aes_string(vari, 'AMOUNT_COMP') для ссылки на имена столбцов как строки, либо назначить COMP_VAR1 = vari в summarize инструкции и использовать исходный код графика.