【问题标题】:Split row with yearly value into rows with monthly values将具有年度值的行拆分为具有月度值的行
【发布时间】:2018-06-01 11:38:26
【问题描述】:

我有一张带有年度汇总值的表格。我想通过将“总计”数字除以 12 将它们分成每月值。

library(readr)
myData = read_delim("Date,b,c,d,Total\n2018,NA,NA,NA,12\n2018,0.5,0.5,NA,24\n2018,0.3,NA,0.5,36\n", delim=",")
myData 
# A tibble: 3 x 5
   Date     b     c     d Total
  <int> <dbl> <dbl> <dbl> <int>
1  2018  NA    NA    NA      12
2  2018   0.5   0.5  NA      24
3  2018   0.3  NA     0.5    36

期望的输出(对于第一行,我预计总共 36 行):

   Date       b     c     d     Total
 1 2018-01-01 NA    NA    NA        1
 2 2018-02-01 NA    NA    NA        1
 3 2018-03-01 NA    NA    NA        1
 4 2018-04-01 NA    NA    NA        1
 5 2018-05-01 NA    NA    NA        1
 6 2018-06-01 NA    NA    NA        1
 7 2018-07-01 NA    NA    NA        1
 8 2018-08-01 NA    NA    NA        1
 9 2018-09-01 NA    NA    NA        1
10 2018-10-01 NA    NA    NA        1
11 2018-11-01 NA    NA    NA        1
12 2018-12-01 NA    NA    NA        1

我已经在这里检查了接受的答案:Break summed row into individual rows in R 但不幸的是,这对我不起作用。

【问题讨论】:

  • myData &lt;- myData[rep(1:nrow(myData), each = 12),]; myData$Total &lt;- myData$Total/12
  • 谢谢,重命名数据框
  • 另外:包括你正在使用的包。 read_delim 不是来自基础 R,而是来自 readr

标签: r


【解决方案1】:

如果您确实需要每月日期,您可以使用complete 来执行此操作。

我根据Total 为每一年创建了一个唯一的 ID(您可能必须使用它,具体取决于您的数据的实际组织方式)。然后,我将您的日期列设置为基于一年中的第一天的日期。然后我用complete 填写了一年中剩下的月份。 fill 用于完成行,mutate 用于将总数除以 12。

library(dplyr)
library(tidyr)
library(readr)
library(lubridate)

myData = read_delim("Date,b,c,d,Total\n2018,NA,NA,NA,12\n2018,0.5,0.5,NA,24\n2018,0.3,NA,0.5,36\n", delim=",")
myData 
#  # A tibble: 3 x 5
#     Date      b      c      d Total
#    <int>  <dbl>  <dbl>  <dbl> <int>
#  1  2018 NA     NA     NA        12
#  2  2018  0.500  0.500 NA        24
#  3  2018  0.300 NA      0.500    36

myData %>%
  mutate(group_id = group_indices(., Total)) %>% 
  mutate(Date = dmy(paste("01/01/",Date))) %>% 
  group_by(group_id) %>% 
  complete(Date = seq.Date(Date[1],by = "month",length.out = 12)) %>% 
  fill(b,c,d,Total) %>% 
  mutate(Total = Total/12) %>%
  ungroup() %>% 
  select(-group_id)

#  # A tibble: 36 x 5
#     Date           b     c     d Total
#     <date>     <dbl> <dbl> <dbl> <dbl>
#   1 2018-01-01    NA    NA    NA  1.00
#   2 2018-02-01    NA    NA    NA  1.00
#   3 2018-03-01    NA    NA    NA  1.00
#   4 2018-04-01    NA    NA    NA  1.00
#   5 2018-05-01    NA    NA    NA  1.00
#   6 2018-06-01    NA    NA    NA  1.00
#   7 2018-07-01    NA    NA    NA  1.00
#   8 2018-08-01    NA    NA    NA  1.00
#   9 2018-09-01    NA    NA    NA  1.00
#  10 2018-10-01    NA    NA    NA  1.00
#  # ... with 26 more rows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2018-10-09
    • 2020-05-26
    • 2020-12-04
    相关资源
    最近更新 更多