【问题标题】:Converting columns with date to rows in R将带有日期的列转换为R中的行
【发布时间】:2019-11-07 17:31:52
【问题描述】:

假设我们在 R 中有一个这样的 data.frame:

d = data.frame('2019q1' = 1, '2019q2' =2, '2019q3' = 3)

看起来像这样:

  X2019q1 X2019q2 X2019q3
1       1       2       3

我怎样才能把它变成这样:

Year    Quarter    Value
2019    1          1
2019    2          2
2019    3          3

【问题讨论】:

    标签: r dataframe dplyr data-transform


    【解决方案1】:

    我们可以将gather 转换成'long' 格式并提取str_extractparse_number 的组件

    library(dplyr)
    library(tidyr)
    library(stringr)
    gather(d) %>% 
       transmute(Year = readr::parse_number(key), 
                 Quarter = as.numeric(str_extract(key, "(?<=q)\\d+$")), value)
    #  Year Quarter value
    #1 2019       1     1
    #2 2019       2     2
    #3 2019       3     3
    

    【讨论】:

      【解决方案2】:

      tidyr 的较新 pivot_longer 函数的快速方法,它允许您一次性重塑数据和拆分列。看看列名:

      names(d)
      #> [1] "X2019q1" "X2019q2" "X2019q3"
      

      您会看到它们以X 开头以使名称有效,并且年份和季度由"q" 分隔。使用它作为pivot_longer 中的分隔符来拆分年份和季度,然后从年份中删除非数字。或者,您可以使用dplyr::mutate 将列转换为数字。

      library(tidyr)
      
      d %>%
        pivot_longer(everything(), names_to = c("Year", "Quarter"), 
                     names_sep = "q", values_to = "Value") %>%
        dplyr::mutate(Year = stringr::str_remove(Year, "\\D"))
      #> # A tibble: 3 x 3
      #>   Year  Quarter Value
      #>   <chr> <chr>   <dbl>
      #> 1 2019  1           1
      #> 2 2019  2           2
      #> 3 2019  3           3
      

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 2021-04-15
        • 2017-12-30
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多