#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
инструкции и использовать исходный код графика.