当函数在 R 中将单行分解为多行时复制列数据

Copy column data when function unaggregates a single row into multiple in R

我需要帮助来计算年度总计(针对许多计划中的每一项)并使用简单的除法公式将其分解为每个月。我需要对几列的每个不同组合执行此操作,同时复制从年度总数到每个月总数的列。该循环会将公式应用于两列,并循环遍历向量中的每个不同组。我试着在下面的例子中解释,因为它有点复杂。

我有:

| Init | Name | Date |Total Savings|Total Costs| 
|  A   | John | 2015 |    TotalD   |   TotalD  |
|  A   | Mike | 2015 |    TotalE   |   TotalE  |
|  A   |  Rob | 2015 |    TotalF   |   TotalF  |
|  B   | John | 2015 |    TotalG   |   TotalG  |
|  B   | Mike | 2015 |    TotalH   |   TotalH  |
......
| Init | Name | Date |Total Savings|Total Costs| 
|  A   | John | 2016 |    TotalI   |   TotalI  |
|  A   | Mike | 2016 |    TotalJ   |   TotalJ  |
|  A   |  Rob | 2016 |    TotalK   |   TotalK  |
|  B   | John | 2016 |    TotalL   |   TotalL  |
|  B   | Mike | 2016 |    TotalM   |   TotalM  |

我要为第一行循环一个函数以获取 "Total Savings" 和 "Total Costs" 并除以 12,其中 Date = 2015 和 9,其中 Date = 2016(年初至今至 9 月)并为每个创建一个单独的行。我基本上是连续打破年度总数并为一年中的每个月创建一行。我在 运行 中需要帮助,该循环还复制列 "Init"、"Name",直到 "Init"、"Name" 组合不明显。另外,请注意基于年份的划分公式也会有所不同。我想我可以分离 2015 年和 2016 年的数据集并使用两个不同的函数并合并,如果这样会更容易的话。下面应该是输出:

| Init | Name | Date       |Monthly Savings|Monthly Costs| 
|  A   | John | 01-01-2015 |   TotalD/12*  |   MonthD    |
|  A   | John | 02-01-2015 |    MonthD     |   MonthD    |
|  A   | John | 03-01-2015 |    MonthD     |   MonthD    |
...
|  A   | Mike | 01-01-2016 |    TotalE/9*  |   TotalE    |
|  A   | Mike | 02-01-2016 |    TotalE     |   TotalE    |
|  A   | Mike | 03-01-2016 |    TotalE     |   TotalE    |
...
|  B   | John | 01-01-2015 |   TotalG/12*  |   MonthD    |
|  B   | John | 02-01-2015 |    MonthG     |   MonthD    |
|  B   | John | 03-01-2015 |    MonthG     |   MonthD    |

TotalD/12* = MonthD - 这是 2015 年的公式
TotalE/9* = MonthE - 这是 2016 年的公式

如有任何帮助,我们将不胜感激...

首先,这里有一些可重现的数据,其中描述了列:

myData <-
  data.frame(
    Init = rep(LETTERS[1:3], each = 4)
    , Name = rep(c("John", "Mike"), each = 2)
    , Date = 2015:2016
    , Savings = (1:12)*1200
    , Cost = (1:12)*2400
  )

接下来,设置每年要使用的除数:

toDivide <-
  c("2015" = 12, "2016" = 9)

然后,我使用 magrittr 管道将数据拆分为单行,然后使用 lapply 循环遍历它们以将每一行扩展为适当的行数(9 或12) 用节省的费用除以月数。最后,dplyrbind_rows 将行重新拼接在一起。

myData %>%
  split(1:nrow(.)) %>%
  lapply(function(x){
    temp <- data.frame(
      Init = x$Init
      , Name = x$Name
      , Date = as.Date(paste(x$Date
                           , formatC(1:toDivide[as.character(x$Date)]
                                     , width = 2, flag = "0")
                           , "01"
                           , sep = "-"))
      , Savings = x$Savings / toDivide[as.character(x$Date)]
      , Cost = x$Cost / toDivide[as.character(x$Date)]
    )
  }) %>%
  bind_rows()

这个head看起来像:

    Init Name       Date  Savings      Cost
1      A John 2015-01-01 100.0000  200.0000
2      A John 2015-02-01 100.0000  200.0000
3      A John 2015-03-01 100.0000  200.0000
4      A John 2015-04-01 100.0000  200.0000
5      A John 2015-05-01 100.0000  200.0000
6      A John 2015-06-01 100.0000  200.0000

每个扩展行都有相似的条目。