Мне нужно создать синюю галочку на R. В основном у меня есть информация о значениях, выделенных красным и желтым цветом для разных компаний. Мне нужно написать код, который делает: какой бы ни была сумма желтого и красного в 2022 году для компании x, синяя линия компании x должна начинаться с этого значения, а затем увеличиваться на 2–3 % каждый год (вот почему это так тик). Кто-нибудь может помочь, пожалуйста? Примером может служить компания, у которой в 2022 году 20 красных и 10 желтых. В этом случае синяя линия должна начинаться с 30 в 2022 г., 30* 1,02 или 1,03 в 2023 г. и т. д. Извините, что не добавляю базу данных, но я не уверен, могу ли я поделиться ею на законных основаниях. Так что любой был бы так любезен, чтобы помочь, было бы здорово.
Пример:
2022 100 Красный
A 2022 20 Желтый
А 2022 120 (100+20) Синий
2023 100 Красный
А 2023 50 Желтый
А 2023 120*1,02 Синий
А 2024 130 Красный
А 2024 55 Желтый
А 2024 120*1,02*1,02 Синий
С каждым годом первоначальная сумма желтого и красного в 2022 году увеличивается на 2%.
синяя линия не начинается с суммы красного и желтого в примере. Он начинается примерно на уровне красного.
@langtang начинается с 2021 года, но в этом примере нет желтых данных
@Sandwichnick добавил пример для одной компании, помогло? благодарю вас
Итак, желтый здесь добавляется к красному... в вашем текстовом примере желтый постоянно меньше, чем красный, но на изображении желтый выше, чем красный, так что я думаю, вы имеете в виду, что желтый цвет на графике добавляется к (укладывается на ) красный
@langtang в основном суммирует красный + желтый в 2022 году, а затем берет это значение 2022 года и увеличивает его на 2% в год на протяжении многих лет.
ок, извините, что запутался. Получить значение синего очень просто — см. ниже. Если вам нужна помощь с графикой, дайте нам знать.
@langtang, то, что ты сделал, великолепно и очень помогает, спасибо. Одна вещь: у меня более одной компании, то есть не только A, но и B, и C... и т. д. Поэтому мне нужна синяя линия для каждой компании. Не беспокойтесь о графике, мне просто нужно иметь начальное значение 2022 года и соответствующий рост для каждой компании.
конечно, добавлено в ответ ниже
Если d
— это ваши данные (скажем, для нескольких компаний), то получить синие данные для каждой компании несложно.
inner_join(
d, d %>%
filter(y==2022) %>%
mutate(blue=red+yellow) %>%
select(company, blue),
by = "company"
) %>%
mutate(blue = blue*(1.02^(y-2022)))
# A tibble: 6 x 5
company y red yellow blue
<chr> <int> <dbl> <dbl> <dbl>
1 A 2022 100 20 120
2 A 2023 100 50 122.
3 A 2024 130 55 125.
4 B 2022 200 15 215
5 B 2023 205 18 219.
6 B 2024 210 30 224.
Входные данные:
d = tibble(
company=c(rep("A",3),rep("B",3)),
y = rep(2022:2024,2),
red= c(100, 100, 130, 200, 205, 210),
yellow = c(20, 50,55, 15,18, 30)
)
Вот расширенный пример построения графика с использованием поддельных данных, который пытается приблизиться к графику в исходном сообщении. Если d
ваши данные для красного и желтого (см. ниже структуру/генерацию d
), то вы можете:
base = colSums(d[d$year==2022,2])
blue_data = tibble(year=2022:2040) %>%
mutate(value=base*(1.02^(year-2022)),
group = "blue",
plotmax = base*(1.03^(year-2022)),
plotmin = value)
d
и blue_data
для создания данных графика# create plot data
plot_data <- rbind(
d %>% mutate(
plotmax = c(
d %>% filter(group= = "red") %>% pull(value),
d %>% filter(year>=2021) %>% group_by(year) %>% summarize(value=sum(value)) %>% pull(value)),
plotmin = c(
rep(0,times=nrow(d %>% filter(group= = "red"))),
d %>% filter(year>=2021, group= = "red") %>% pull(value)
),
blue_data
)
plot_data
manual_values = c("red" = "red", "blue" = "blue", "yellow" = "yellow")
ggplot(plot_data, aes(x=year, color=group,fill=group)) +
geom_ribbon(aes(ymin=plotmin, ymax=plotmax)) +
scale_color_manual(values=manual_values)+
scale_fill_manual(values=manual_values) +
theme(legend.position='bottom')
Входные данные (d
)
structure(list(year = c(2015L, 2016L, 2017L, 2018L, 2019L, 2020L,
2021L, 2022L, 2023L, 2024L, 2025L, 2026L, 2027L, 2028L, 2029L,
2030L, 2031L, 2032L, 2033L, 2034L, 2035L, 2036L, 2037L, 2038L,
2039L, 2040L, 2021L, 2022L, 2023L, 2024L, 2025L, 2026L, 2027L,
2028L, 2029L, 2030L, 2031L, 2032L, 2033L, 2034L, 2035L, 2036L,
2037L, 2038L, 2039L, 2040L), value = c(220, 242.857142857143,
265.714285714286, 288.571428571429, 311.428571428571, 334.285714285714,
357.142857142857, 380, 360, 352.941176470588, 345.882352941176,
338.823529411765, 331.764705882353, 324.705882352941, 317.647058823529,
310.588235294118, 303.529411764706, 296.470588235294, 289.411764705882,
282.352941176471, 275.294117647059, 268.235294117647, 261.176470588235,
254.117647058824, 247.058823529412, 240, 0, 5, 10, 15, 20, 25,
30, 35, 40, 45, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50), group = c("red",
"red", "red", "red", "red", "red", "red", "red", "red", "red",
"red", "red", "red", "red", "red", "red", "red", "red", "red",
"red", "red", "red", "red", "red", "red", "red", "yellow", "yellow",
"yellow", "yellow", "yellow", "yellow", "yellow", "yellow", "yellow",
"yellow", "yellow", "yellow", "yellow", "yellow", "yellow", "yellow",
"yellow", "yellow", "yellow", "yellow")), row.names = c(NA, -46L
), class = c("tbl_df", "tbl", "data.frame"))
Не могли бы вы использовать искусственные данные, как вы предоставили текст в виде кода. Может быть, просто Dataframe с входами и целевым выходом. Я лично не понимаю, что вы имеете в виду под «2% или 3%». Как узнать, какой процент брать? это еще один ввод?