r - 在数据框中创建列作为 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"))
请指教!
解决方案
你可以简单地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
你也可以两者都做:)
推荐阅读
- haskell - Megaparsec:嵌套缩进块吃太多
- amazon-sagemaker - 为什么我觉得 AWS SageMaker GPU 没有更快?
- python - 如何使用 cv2.face 和 cv2 使用 QT 创建窗口而不会出错?
- python - 在python中根据转移矩阵权重选择一个词
- javascript - 如何对反应表中表行末尾的结果求和
- python - 在 Python 中是否有类似 MATLAB 的 vpasolve 的等效求解器
- bash - 如何使 bash -x 在环境功能上工作,而不仅仅是脚本?
- javascript - Javascript:增加结束变量
- matlab - Matlab - ODE 函数 - 集成我自己与 ode45 函数
- css - CSS在页脚中证明内容问题