使用粘贴进行动态添加

时间:2018-01-30 14:18:57

标签: r

我有一份报告,我需要按季度进行,包括将各种收入组合在一起,以制定一个过去12个月和过去24个月的总计。

而不是重新输入一堆列名以在滚动的基础上将每一列添加到一起我希望创建一个函数,我可以为尾随月份声明变量,这样我就可以更容易地将它们加在一起。

我的数据帧all_rel包含我需要总结的所有数据。它包含以下字段(不幸的是,我只是继承了这个报告,它并不是完全整齐的格式)

Total_Processing_Revenue Ancillary_Revenue

数据框中的

我在单独的列中有T24个月的这些数据点

我继承的人放在一起的脚本使用以下内容将列添加到一起:

    all_rel$anci_rev_cy_ytd = all_rel$X201701Ancillary_Revenue+all_rel$X201702Ancillary_Revenue+all_rel$X201703Ancillary_Revenue+...+all_rel$X201712Ancillary_Revenue

我试图希望用粘贴做一些事情,但似乎无法让它发挥作用

    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 ='')

当我尝试将这些字段加在一起时,我得到一个&#34;非数字参数给二元运算符&#34;错误。我能做些什么而不是我一直试图做的事情吗?

粘贴(rpt,py,revmonth1,rev2,sep =&#39;&#39;)返回&#34; all_rel $ X201601Ancillary_Revenue&#34;

有没有办法可以告诉R我粘贴这些名字的原因是引用其中的数据而不是我粘贴的文字?

我对R来说相当新鲜(我一直在学习,试图让我的生活更轻松。

最终我需要弄清楚如何将此混乱转换为整洁的数据格式,其中每个收入列都有一个月和一年,但我希望使用此问题来了解如何使用替代逻辑来更好地自动化流程。也许我只是错误地说我的搜索错误,但我正在努力找到我试图解决的确切问题。

非常感谢任何帮助。

::编辑::

添加了dput(head)

    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")

1 个答案:

答案 0 :(得分:0)

以下是如何整理数据(调用您的数据dd):

    library(tidyr)
    library(dplyr)

    gather(dd, key = key, value = value, -Chain) %>%
        mutate(year = substr(key, start = 2, 5),
                     month = substr(key, 6, 7),
                     metric = substr(key, 8, nchar(key))) %>%
        select(-key) %>%
        spread(key = metric, value = value)

    #     Chain year month Ancillary_Revenue Net_Revenue Total_Processing_Revenue
    # 1  000001 2016    01             -2.92       -2.92                     0.00
    # 2  000001 2016    02              0.00        0.00                     0.00
    # 3  000001 2016    03                NA        0.00                     0.00
    # 4  000029 2016    01           8864.66    25005.14                 16140.48
    # 5  000029 2016    02          28665.65    41918.84                 13253.19
    # 6  000029 2016    03                NA    23843.76                 15037.39
    # 7  000060 2016    01          32548.70    55787.59                 23238.89
    # 8  000060 2016    02          31963.30    56696.34                 24733.04
    # 9  000060 2016    03                NA    62494.51                 27523.19
    # 10 000064 2016    01            422.52     3996.69                  3574.17
    # 11 000064 2016    02            393.88     4789.57                  4395.69
    # 12 000064 2016    03                NA     5262.87                  4792.63
    # 13 000076 2016    01          10135.90    14229.41                  4093.51
    # 14 000076 2016    02           9010.41    13113.20                  4102.79
    # 15 000076 2016    03                NA    20551.79                  4805.61
    # 16 000079 2016    01           2814.75     3455.85                   641.10
    # 17 000079 2016    02           4664.59     5211.27                   546.68
    # 18 000079 2016    03                NA     7646.75                  2134.72

完成后,您可以使用您想要的任何分组操作 - 总和,滚动总和或平均值等。您可能对yearmon包中提供的zoo类感兴趣,{{3当然还有关于this question on rolling sums by group的R-FAQ。