【问题标题】:Insert rows corresponding to each month in an yearly data在年度数据中插入与每个月对应的行
【发布时间】:2019-10-12 21:29:17
【问题描述】:

我有一个数据框,其中包含 2014 年到 2018 年的年度数据。我希望将此数据框扩展为月度值,并且基本上将每个变量的值除以 12 作为每个月的值。 请注意:目前我的数据框中没有月份列。 所以,如果有 5 个产品,我有 5*5 行和 5 列:“year”、“Product_ID”、“Var1”、“Var2”和“Var3”作为列。

最后,我想要插入“月”的 5*12 行和 6 列。

我已经尝试过这段代码,但它不起作用:

df_new$date <- NA
df_new <- complete(df,Product_ID, date = full_seq(2014,1))

有什么建议吗?

【问题讨论】:

    标签: r data-transform data-handling


    【解决方案1】:

    一种选择是使用uncount 重复行12 次,创建一个新列month 为每个1:12 取值year,然后将Var 列除以12。

    library(dplyr)
    library(tidyr)
    
    df %>%
      uncount(12) %>%
      group_by(year) %>%
      mutate(month = 1:12) %>%
      mutate_at(vars(Var1, Var2), ~./12)
    
    # Groups:   year [3]
    #    year Product_ID  Var1  Var2 month
    #   <int> <chr>      <dbl> <dbl> <int>
    # 1  2013 A          0.833     5     1
    # 2  2013 A          0.833     5     2
    # 3  2013 A          0.833     5     3
    # 4  2013 A          0.833     5     4
    # 5  2013 A          0.833     5     5
    # 6  2013 A          0.833     5     6
    # 7  2013 A          0.833     5     7
    # 8  2013 A          0.833     5     8
    # 9  2013 A          0.833     5     9
    #10  2013 A          0.833     5    10
    # … with 26 more rows
    

    completefill 的其他选项

    df %>%
      mutate(month = 1) %>%
      complete(year, month = 1:12) %>%
      fill(Product_ID, Var1, Var2) %>%
      mutate_at(vars(Var1, Var2), ~./12)
    

    数据

    df <- data.frame(year = 2013:2015, Product_ID = c("A", "B", "C"), 
          Var1 = c(10, 20, 30), Var2 = c(60, 80, 120), stringsAsFactors = FALSE)
    

    【讨论】:

    • 嘿,我需要澄清一下。我明白“~”。表示将左侧的每个变量除以 12。但我无法一起理解这个符号的含义。如果我只使用 'mutate_at(vars(Var1, Var2), /12)' 它会给出错误。我读过这篇文章:stackoverflow.com/questions/13446256/… 和 ?formula 等,但我仍然不清楚这种组合。你能解释一下这个案例的意义吗?
    • @user10579790 这些是purrr 公式样式函数,您可以将其替换为匿名函数。例如mtcars %&gt;% mutate_at(1, function(x) x + 10)mtcars %&gt;% mutate_at(1, ~. + 10) 是相同的。它们只是不同的编码风格。您分享的链接有不同的参考,此处不适用。
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多