R语言paste动态求和列报错,求自动化求和与数据整理方案
我的需求与困境
- 每季度生成营收报表,需计算过去12/24个月的Total_Processing_Revenue、Ancillary_Revenue总计
- 数据框
all_rel的月度数据以XYYYYMM[RevenueType]的格式分散在不同列,手动写列名求和效率极低 - 尝试用
paste拼接列名字符串来求和,但执行时触发错误:non-numeric argument to binary operator——后来才明白paste返回的是字符串,不是对数据列的引用
我试过的代码
直接罗列列名的低效写法
all_rel$anci_rev_cy_ytd = all_rel$X201701Ancillary_Revenue+all_rel$X201702Ancillary_Revenue+...+all_rel$X201712Ancillary_Revenue
尝试用paste简化但失败的代码
dfname <- 'all_rel$X' revmonth1 <- '01' revmonth2 <- '02' revmonth3 <- '03' revmonth4 <- '04' revmonth5 <- '05' revmonth6 <- '06' revmonth7 <- '07' revmonth8 <- '08' revmonth9 <- '09' revmonth10 <- '10' revmonth11 <- '11' revmonth12 <- '12' cy <- '2017' py <- '2016' rev1 <- 'Total_Processing_Revenue' rev2 <- 'Ancillary_Revenue' all_rel$anci_rev_py_ytd = paste(dfname,py,revmonth1,rev2, sep ='')+paste(dfname,py,revmonth2,rev2, sep ='')+...paste(dfname,py,revmonth12,rev2, sep ='')
数据框头部的dput结果
structure(list(Chain = c("000001", "000029", "000060", "000064","000076", "000079"), X201601Net_Revenue = c(-2.92, 25005.14,55787.59, 3996.69, 14229.41, 3455.85),X201601Total_Processing_Revenue = c(0,16140.48, 23238.89, 3574.17, 4093.51, 641.1), X201601Ancillary_Revenue = c(-2.92,8864.66, 32548.7, 422.52, 10135.9, 2814.75), X201602Net_Revenue = c(0,41918.84, 56696.34, 4789.57, 13113.2, 5211.27), X201602Total_Processing_Revenue = c(0,13253.19, 24733.04, 4395.69, 4102.79, 546.68), X201602Ancillary_Revenue = c(0,28665.65, 31963.3, 393.88, 9010.41, 4664.59), X201603Net_Revenue = c(0,23843.76, 62494.51, 5262.87, 20551.79, 7646.75), X201603Total_Processing_Revenue = c(0,15037.39, 27523.19,4792.63,4805.61,2134.72)),.Names=c("Chain","X201601Net_Revenue","X201601Total_Processing_Revenue","X201601Ancillary_Revenue","X201602Net_Revenue","X201602Total_Processing_Revenue","X201602Ancillary_Revenue","X201603Net_Revenue", "X201603Total_Processing_Revenue"), row.names = c(NA,6L), class = "data.frame")
期望的解决方向
我是R新手,最终目标是把数据转成tidy格式,但现在先想解决自动化求和的问题,希望能得到简单易懂的代码示例,最好能兼顾临时求和和长期的tidy格式转换~
内容的提问来源于stack exchange,提问作者MarkM




