将汇总行分解为 R 中的单独行
Break summed row into individual rows in R
我有一组数据,其中一行中存储了特定值的年度总计(观察)。我想整理 R 中的数据,以便使用一个简单的方程式 (total/12) 将每个月的总行分解为每个月,该方程式将年度总计除以 12 行中的每行除以 12 作为每月总计。我正在尝试在 R 中执行此操作,但我是初学者,不太确定从哪里开始。示例如下:
Date | Total
2015 | 12,000
Some R function to convert to:
Date | Total
01-01-2015 | 1,000
02-01-2015 | 1,000
03-01-2015 | 1,000
这是一个多年的示例数据集,我认为这是您想要的用例:
myData <-
data.frame(
Date = 2011:2015
, Total = (1:5)*1200
)
然后,我将 data.frame 拆分为 Date
列(假设年份是唯一的),循环遍历 lapply
以修改为您想要的月度值,然后将它们与 dplyr
中的 bind_rows
拼接在一起(还需要加载 dplyr
或 magrittr
才能使管道 (%>%
) 正常工作)。
myData %>%
split(.$Date) %>%
lapply(function(x){
temp <- data.frame(
Date = as.Date(paste(x$Date
, formatC(1:12, width = 2, flag = "0")
, "01"
, sep = "-"))
, Total = x$Total / 12
)
}) %>%
bind_rows()
给出(注意,使用 ...
表示跳过的行)
Date Total
1 2011-01-01 100
2 2011-02-01 100
3 2011-03-01 100
...
16 2012-04-01 200
17 2012-05-01 200
18 2012-06-01 200
...
29 2013-05-01 300
30 2013-06-01 300
31 2013-07-01 300
...
43 2014-07-01 400
44 2014-08-01 400
45 2014-09-01 400
...
58 2015-10-01 500
59 2015-11-01 500
60 2015-12-01 500
如果按照评论中的建议,您需要每年除以不同的月数,我会创建一个以年份命名的除数向量。在这里,我将 dplyr
用于 n_distinct
和 magrittr
管道以简化常见情况的命名。然后,add/change 不同年份的条目:
toDivide <-
rep(12, n_distinct(myData$Date)) %>%
setNames(sort(unique(myData$Date)))
toDivide["2016"] <- 9
然后,您可以使用此向量代替上面的 12
。因此,替换为:
Total = x$Total / 12
在 lapply
循环中,用这个:
Total = x$Total / toDivide[as.character(x$Date)]
它应该除以那一年的条目,而不是总是除以相同的东西。
我有一组数据,其中一行中存储了特定值的年度总计(观察)。我想整理 R 中的数据,以便使用一个简单的方程式 (total/12) 将每个月的总行分解为每个月,该方程式将年度总计除以 12 行中的每行除以 12 作为每月总计。我正在尝试在 R 中执行此操作,但我是初学者,不太确定从哪里开始。示例如下:
Date | Total
2015 | 12,000
Some R function to convert to:
Date | Total
01-01-2015 | 1,000
02-01-2015 | 1,000
03-01-2015 | 1,000
这是一个多年的示例数据集,我认为这是您想要的用例:
myData <-
data.frame(
Date = 2011:2015
, Total = (1:5)*1200
)
然后,我将 data.frame 拆分为 Date
列(假设年份是唯一的),循环遍历 lapply
以修改为您想要的月度值,然后将它们与 dplyr
中的 bind_rows
拼接在一起(还需要加载 dplyr
或 magrittr
才能使管道 (%>%
) 正常工作)。
myData %>%
split(.$Date) %>%
lapply(function(x){
temp <- data.frame(
Date = as.Date(paste(x$Date
, formatC(1:12, width = 2, flag = "0")
, "01"
, sep = "-"))
, Total = x$Total / 12
)
}) %>%
bind_rows()
给出(注意,使用 ...
表示跳过的行)
Date Total
1 2011-01-01 100
2 2011-02-01 100
3 2011-03-01 100
...
16 2012-04-01 200
17 2012-05-01 200
18 2012-06-01 200
...
29 2013-05-01 300
30 2013-06-01 300
31 2013-07-01 300
...
43 2014-07-01 400
44 2014-08-01 400
45 2014-09-01 400
...
58 2015-10-01 500
59 2015-11-01 500
60 2015-12-01 500
如果按照评论中的建议,您需要每年除以不同的月数,我会创建一个以年份命名的除数向量。在这里,我将 dplyr
用于 n_distinct
和 magrittr
管道以简化常见情况的命名。然后,add/change 不同年份的条目:
toDivide <-
rep(12, n_distinct(myData$Date)) %>%
setNames(sort(unique(myData$Date)))
toDivide["2016"] <- 9
然后,您可以使用此向量代替上面的 12
。因此,替换为:
Total = x$Total / 12
在 lapply
循环中,用这个:
Total = x$Total / toDivide[as.character(x$Date)]
它应该除以那一年的条目,而不是总是除以相同的东西。