【问题标题】:dplyr convert year in column name into new rowsdplyr 将列名中的年份转换为新行
【发布时间】:2023-01-18 21:19:26
【问题描述】:

我如何在 R 中使用 dplyr 在 ID 列以外的列中识别每列末尾指定的年份(跟随各种字符),然后将相应的行放在新的数据框中,并将该年份表示为新列,最后有一个新列,它只是从原始列名中删除了年份?

例如,我想将 2 条记录的数据框转换为 col1、col2_1980、col2_1981、col3_1980 和 col3_1981 的 5 列,其中 col1 是一个字符值(“a”或“b”)到一个数据框4 条记录,其中 col1 =“a”表示 2 条记录,col1 =“b”表示 2 条记录,然后 col2 =“1980”表示每个 col1 值的 1 条记录,col2 =“1981”表示每个 col1 值的 1 条记录。

如果我可以使用捕获年份的公式,那么使用 dplyr::separate() 可能会起作用:

substr(colnames(df1),
         nchar(colnames(df1)) - 3,
         nchar(colnames(df1)))

原版的

set.seed(3)
df1 <-
  rbind(
  data.frame(
      col1 = "a", 
      col2_1980 = runif(1), 
      col2_1981 = runif(1), 
      col3_1980 = runif(1), 
      col3_1981 = runif(1)),
  data.frame(  
      col1 = "b", 
      col2_1980 = runif(1), 
      col2_1981 = runif(1), 
      col3_1980 = runif(1), 
      col3_1981 = runif(1)))

  col1 col2_1980 col2_1981 col3_1980 col3_1981
1    a 0.1680415 0.8075164 0.3849424 0.3277343
2    b 0.6021007 0.6043941 0.1246334 0.2946009

目标

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    请尝试下面的代码,使用 pivot_longer 完成预期的结果, pivot_wider

    代码

    df2 <- df1 %>% pivot_longer(c(contains('_'))) %>% 
    mutate(year=str_extract(name,'(?<=\_)\d.*'), name=str_extract(name,'^.*(?=\_)')) %>% 
    pivot_wider(c(col1,year), names_from = 'name', values_from = 'value')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2018-04-20
      相关资源
      最近更新 更多