当函数在 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) 用节省的费用除以月数。最后,dplyr
的 bind_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
每个扩展行都有相似的条目。
我需要帮助来计算年度总计(针对许多计划中的每一项)并使用简单的除法公式将其分解为每个月。我需要对几列的每个不同组合执行此操作,同时复制从年度总数到每个月总数的列。该循环会将公式应用于两列,并循环遍历向量中的每个不同组。我试着在下面的例子中解释,因为它有点复杂。
我有:
| 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) 用节省的费用除以月数。最后,dplyr
的 bind_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
每个扩展行都有相似的条目。