【问题标题】:Reshape dataframe that has years in column names重塑列名中有年份的数据框
【发布时间】:2019-06-05 20:50:00
【问题描述】:

我正在尝试将 R 中的宽数据框重塑为长数据框。阅读reshape2tidyr 中的一些函数,它们似乎都可以处理,如果你有1 个要拆分的变量,而我有~10 个。每列都有类型变量名称和年份,我希望将其拆分,以便年份成为每一行中的一个因素,然后列显着减少,数据集更易于使用。

当前表格看起来像这样。

 State  Rank  Name     V1_2016  V1_2017  V1_2018  V2_2016  V2_2017  V2_2018 
 TX     1     Company  1        2        3        4        5        6  

我尝试使用 reshape2 来融合数据,但它看起来像垃圾,并且在应该只有 10k 左右时是 127k 行。

我正在尝试让数据看起来像这样。

  State Rank    Name Year V1 V2
1    TX    1 Company 2016  1  4
2    TX    1 Company 2017  2  5
3    TX    1 Company 2018  3  6

【问题讨论】:

    标签: r


    【解决方案1】:

    data.table 中的melt 选项可以根据列名中的patterns 采用多个measure

    library(data.table)
    nm1 <- unique(sub(".*_", "", names(df)[-(1:3)]))
    melt(setDT(df), measure = patterns("V1", "V2"),
           value.name = c("V1", "V2"), variable.name = "Year")[,
           Year := nm1[Year]][]
    #    State Rank    Name Year V1 V2
    #1:    TX    1 Company 2016  1  4
    #2:    TX    1 Company 2017  2  5
    #3:    TX    1 Company 2018  3  6
    

    数据

    df <- structure(list(State = "TX", Rank = 1L, Name = "Company", V1_2016 = 1L, 
        V1_2017 = 2L, V1_2018 = 3L, V2_2016 = 4L, V2_2017 = 5L, V2_2018 = 6L),
        class = "data.frame", row.names = c(NA, 
    -1L))
    

    【讨论】:

    • 谢谢!这非常适合我需要的东西。感谢您的帮助。
    【解决方案2】:

    dplyrtidyr 的一种可能性可能是:

    df %>%
     gather(var, val, -c(1:3)) %>%
     separate(var, c("var", "Year")) %>%
     spread(var, val)
    
      State Rank    Name Year V1 V2
    1    TX    1 Company 2016  1  4
    2    TX    1 Company 2017  2  5
    3    TX    1 Company 2018  3  6
    

    它首先将数据从宽格式转换为长格式,不包括前三列。其次,它将原始变量名分成两个新变量:一个包含变量前缀,第二个包含年份。最后,它传播数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多