Создайте столбцы в кадре данных в виде суммы предыдущих столбцов для визуализации гонки гистограммы в R - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь рассчитать налоговые платежи, производимые компаниями каждый год, и показать сумму полностью уплаченных налогов за каждый год, используя предыдущие годы и суммируя их.

После этого я хочу показать гонка гистограммы (но это вне моего вопроса, просто пояснение того, что я хочу).

Я сделал это очень грубым ручным способом, используя mutate.

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

company_payments_clean %>% mutate(Sum2007 = `2006` + `2007`,
                                      Sum2008 = `2006` + `2007` + `2008`, 
                                      Sum2009 = `2006` + `2007` + `2008` + `2009`,
                                      Sum2010 = `2006` + `2007` + `2008` + `2009` + `2010`,
                                      Sum2011 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011`,
                                      Sum2012 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011` + `2012`,
                                      Sum2013 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011` + `2012` + `2013`,
                                      Sum2014 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011` + `2012` + `2013` + `2014`,
                                      Sum2015 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011` + `2012` + `2013` + `2014` + `2015`,
                                      Sum2016 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011` + `2012` + `2013` + `2014` + `2015` + `2016`,
                                      Sum2017 = `2006` + `2007` + `2008` + `2009` + `2010` + `2011` + `2012` + `2013` + `2014` + `2015` + `2016` + `2017`) %>%
                                      select(`Name of organisation`, Sum2007, Sum2008, Sum2009, Sum2010, Sum2011, Sum2012, Sum2013, Sum2014, Sum2015, Sum2016, Sum2017)

Мои данные выглядят так (это открытые данные, которые доступны онлайн)

structure(list(`Name of organisation` = c("?????? ??? ???", "??????? ?????????", 
"????????? ????", "????n Erch", "ADAE", "Adamas mauntin"), `2006` = c(0, 
0, 0, 0, 0, 0), `2007` = c(0, 0, 0, 0, 0, 0), `2008` = c(0, 0, 
0, 0, 0, 0), `2009` = c(0, 0, 63791000, 736145300, 0, 0), `2010` = c(42064000, 
0, 0, 511734500, 0, 188945000), `2011` = c(0, 0, 0, 841354900, 
0, 0), `2012` = c(0, 0, 0, 1603328000, 0, 0), `2013` = c(0, 0, 
417182450, 289145100, 0, 197865350), `2014` = c(0, 0, 214928280, 
102937500, 0, 0), `2015` = c(104671449, 0, 0, 0, 175549000, 0
), `2016` = c(141311733.57, 0, 0, 0, 0, 0), `2017` = c(150181688.63, 
124363263, 0, 0, 0, 0)), row.names = c(NA, -6L), groups = structure(list(
`Name of organisation` = c("?????? ??? ???", "??????? ?????????", 
"????????? ????", "????n Erch", "ADAE", "Adamas mauntin"), 
.rows = list(1L, 2L, 3L, 4L, 5L, 6L)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"), .drop = FALSE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

Пожалуйста, сообщите!

Ответы [ 2 ]

2 голосов
/ 02 ноября 2019

Вы можете просто apply() cumsum().

t(apply(company_payments_clean[-1], MARGIN=1, cumsum))

Для barplot() подходят rownames, поскольку мы могли бы использовать их для цветов и легенды. Вот базовая гистограмма:

dat <- `rownames<-`(
  t(apply(company_payments_clean[-1], MARGIN=1, cumsum)),
  company_payments_clean[[1]]
)

b <- barplot(dat, horiz=TRUE, col=2:7, yaxt="n")
mtext(colnames(dat), 2, at=b, las=1)
legend("bottomright", col=2:7, pch=15, rownames(dat), bty="n", cex=.9)

enter image description here

Примечание: Если вам нужна компания в качестве дополнительного столбца, а не rownames<- просто объедините их с результатом apply в новый data.frame.

dat1 <- cbind.data.frame(`Name of organisation`=company_payments_clean[[1]], 
                        t(apply(company_payments_clean[-1], MARGIN=1, cumsum)))

dat1[, 1:7]
#   Name of organisation 2006 2007 2008      2009       2010       2011
# 1       ?????? ??? ???    0    0    0         0   42064000   42064000
# 2    ??????? ?????????    0    0    0         0          0          0
# 3       ????????? ????    0    0    0  63791000   63791000   63791000
# 4           ????n Erch    0    0    0 736145300 1247879800 2089234700
# 5                 ADAE    0    0    0         0          0          0
# 6       Adamas mauntin    0    0    0         0  188945000  188945000

Вы также можете сделать оба:)

1 голос
/ 02 ноября 2019

Вот решение, использующее dplyr и tidyr для получения тех же результатов, что вы делали выше, так как мы можем выполнить анализ длинных данных и легко перенести их обратно в широкий формат, необходимый для вашего графика. Я позаботился о сортировке данных по годам, если они не всегда находятся в вашем окончательном наборе данных.

library(tidyr)
library(dplyr)

company_payments_clean %>%
  pivot_longer(cols = -`Name of organisation`, names_to = "year") %>%
  group_by(`Name of organisation`) %>%
  arrange(year) %>%
  mutate(tax_sum = cumsum(value)) %>%
  pivot_wider(id_cols = -value,
              names_from = year,
              names_prefix = "Sum",
              values_from = tax_sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...