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

当函数在R中将单行解聚为多行时复制列数据,r,dplyr,tidyr,magrittr,R,Dplyr,Tidyr,Magrittr,我需要帮助(针对许多计划中的每一项)计算年度总数,并使用简单的划分公式将其分解为每个月。我需要对几个列的每个不同组合执行此操作,同时将从年度总数到每个月度总数的列复制下来。循环将把公式应用于两列,并循环遍历向量中每个不同的组。我试图在下面的一个例子中解释,因为它有点复杂 我所拥有的: | Init | Name | Date |Total Savings|Total Costs| | A | John | 2015 | TotalD | TotalD | | A |

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

我所拥有的:

| 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  |
我将为第一行循环一个函数,取“总节省”和“总成本”,然后除以12,其中日期=2015年,9,其中日期=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*=月数-这是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
  )
这张照片的
头像如下所示:

    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

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

谢谢@Mark。不幸的是,该示例简化了实际数据帧的视图。由于我有40多个不同的“init”值和不同的“name”值(不总是重复所示的模式),我希望每次有不同的“init”==“name”组合时都重新启动循环。你说的“重新启动循环”是什么意思?你是想把每一行(年度总结)分成9/12行(每月细目),还是有我遗漏的额外部分?这会分割每一行,而不管init/name的值是多少。我试图将年度总结分解为9/12行,其中“init”和“name”是相同的组合,因为它们会变成不同的组合。正如我提到的,大约有40个不同的“Init”值(这些是项目倡议名称)和10个左右的“Name”值(这些是部门名称)。每个“Init”都会有几个“Name”(部门)报告节省,因此我需要为所有不同的计划和部门组合细分到每月节省和成本,同时保留每个每月节省/成本行中的内容。这更有意义吗?如果数据中每个init/名称对的每个年度摘要都有一行,那么我这里的内容应该可以使用。如果不是的话,我在我的理解中遗漏了一些东西。
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()
    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