首页 > 解决方案 > 在数据框中创建列作为 R 中条形图竞赛可视化的先前列的总和

问题描述

我正在尝试计算公司每年支付的税款,并使用前几年并总结它们显示每年之后的全部税款总和。

这样做之后,我想显示条形图比赛(但这超出了我的问题,只是澄清我想要的)。

我以非常粗略的手动方式完成了它,使用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"))

请指教!

标签: rdplyr

解决方案


你可以简单地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)

在此处输入图像描述

注意:如果您需要 company 作为额外的列,而不是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

你也可以两者都做:)


推荐阅读