【问题标题】:Reshape wide data to long with multiple variables in R (dplyr) [duplicate]在R(dplyr)中使用多个变量将宽数据重塑为长数据[重复]
【发布时间】:2020-11-30 04:00:43
【问题描述】:

我有一个超过 3 波的青少年数据集。我需要将数据从宽调整为长,但我无法弄清楚如何使用 pivot_longer(我检查了其他问题,但也许我错过了一个?)。以下是样本数据:

有数据:

id c1sports c2sports c3sports c1smoker c2smoker c3smoker c1drinker c2drinker c3drinker 
 1       1        1        1        1        1        4         1         5         2
 2       1        1        1        5        1        3         4         1         4
 3       1        0        0        1        1        5         2         3         2
 4       0        0        0        1        3        3         4         2         3
 5       0        0        0        2        1        2         1         5         3
 6       0        0        0        4        1        4         4         3         1
 7       1        0        1        2        2        3         1         4         1
 8       0        1        1        4        4        1         4         5         4
 9       1        1        1        3        2        2         3         4         2
10       0        1        0        2        5        5         4         2         3

想要数据:

id wave sports smoker drinker
 1   1      1      1       1
 1   2      1      1       5
 1   3      1      4       2
 2   1      1      5       4
 2   2      1      1       1
 2   3      1      3       4
 3   1      1      1       2
 3   2      0      1       3
 3   3      0      5       2
 4   1      0      1       4
 4   2      0      3       2
 4   3      0      3       3
 5   1      0      2       1
 5   2      0      1       5
 5   3      0      2       3
 6   1      0      4       4
 6   2      0      1       3
 6   3      0      4       1
 7   1      1      2       1
 7   2      0      2       4
 7   3      1      3       1
 8   1      0      4       4
 8   2      1      4       5
 8   3      1      1       4
 9   1      1      3       3
 9   2      1      2       4
 9   3      1      2       2
10   1      0      2       4
10   2      1      2       2
10   3      0      5       3

到目前为止,我能跑的唯一想法是:

long_dat <- wide_dat %>% 
            pivot_longer(., cols = c1sports:c3drinker)

但这并没有让我为运动、吸烟者和饮酒者分开列。

【问题讨论】:

    标签: r dplyr pivot data-manipulation


    【解决方案1】:

    您可以在pivot_longer 中使用names_pattern 参数。

    tidyr::pivot_longer(df, 
                        cols = -id, 
                        names_to = c('wave', '.value'), 
                        names_pattern = 'c(\\d+)(.*)')
    
    #     id wave  sports smoker drinker
    #   <int> <chr>  <int>  <int>   <int>
    # 1     1 1          1      1       1
    # 2     1 2          1      1       5
    # 3     1 3          1      4       2
    # 4     2 1          1      5       4
    # 5     2 2          1      1       1
    # 6     2 3          1      3       4
    # 7     3 1          1      1       2
    # 8     3 2          0      1       3
    # 9     3 3          0      5       2
    #10     4 1          0      1       4
    # … with 20 more rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2016-06-27
      • 2020-01-02
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      相关资源
      最近更新 更多