当函数在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