【问题标题】:Is there any way to generate year column from existing column names in R?有没有办法从 R 中的现有列名生成年份列?
【发布时间】:2021-07-03 03:42:19
【问题描述】:

我正在使用一个数据集,该数据集将相应年份附加到变量名称作为后缀,例如AXOX1991,其中 AXO 是变量。我正在尝试将年份与变量标签/列名分开以生成年份列,以便可以将数据集作为时间序列数据进行分析。

换句话说,现有的数据集看起来像:

Country AXOX1991 AXOX1992 BXOX1991 BXOX1992 CXOX1991 CXOX1992
Afghanistan 1 2 3 4 5 6
USA 6 5 4 3 2 1

我正在尝试创建以下内容:

Country Year AXO BXO CXO
Afghanistan 1991 1 3 5
Afghanistan 1992 2 4 6
USA 1991 6 4 2
USA 1992 5 3 1

如您所见,X 不仅充当分隔变量名和年份的分隔符,而且还是变量名的一部分。 R中是否有任何方法可以将年份与现有列名中的变量名分开,然后创建如上所示的年份列?

我一直在考虑解决方法,例如循环,但我还没有走多远,我真的很难过。我有 900 多个可变年份,所以我想尽可能避免手动操作。

谢谢!

【问题讨论】:

    标签: r time-series reshape


    【解决方案1】:

    为了完整起见,这里有一个使用melt() 和新的measure() 函数的解决方案(在data.table v1.14.1 中引入):

    library(data.table) # development version 1.14.1
    melt(setDT(df), measure.vars = measure(value.name, year, 
                                           pattern = "(\\w{3})X(\\d{4})"))
    
           Country year AXO BXO CXO
    1: Afghanistan 1991   1   3   5
    2:         USA 1991   6   4   2
    3: Afghanistan 1992   2   4   6
    4:         USA 1992   5   3   1
    

    数据

    library(data.table)
    df <- fread("Country    AXOX1991    AXOX1992    BXOX1991    BXOX1992    CXOX1991    CXOX1992
    Afghanistan 1   2   3   4   5   6
    USA 6   5   4   3   2   1")
    

    【讨论】:

      【解决方案2】:

      您可以使用tidyr::pivot_longer -

      res <- tidyr::pivot_longer(df, cols = -Country, 
                          names_to = c('.value', 'Year'), 
                          names_pattern = '([A-Z]+)X(\\d+)')
      res
      
      #  Country     Year    AXO   BXO   CXO
      #  <chr>       <chr> <int> <int> <int>
      #1 Afghanistan 1991      1     3     5
      #2 Afghanistan 1992      2     4     6
      #3 USA         1991      6     4     2
      #4 USA         1992      5     3     1
      

      数据

      df <- structure(list(Country = c("Afghanistan", "USA"), AXOX1991 = c(1L, 
      6L), AXOX1992 = c(2L, 5L), BXOX1991 = 3:4, BXOX1992 = 4:3, CXOX1991 = c(5L, 
      2L), CXOX1992 = c(6L, 1L)), class = "data.frame", row.names = c(NA, -2L))
      

      【讨论】:

      • 谢谢!我在我的问题中犯了一个错误,我已经更新了它。变量名 also 包含 X — 有没有办法让我替换变量名以便这种方法可以工作?提前致谢!
      • 您可以使用names_pattern 在列名中指定正则表达式模式。请参阅我的更新答案。
      猜你喜欢
      • 2023-04-05
      • 2015-08-19
      • 2017-04-08
      • 2016-06-20
      • 2012-02-14
      • 2012-03-27
      • 2020-02-29
      • 1970-01-01
      • 2016-12-08
      相关资源
      最近更新 更多