在R(dplyr)中使用多个变量将宽数据重塑为long

我有一个超过 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)

但这并没有让我为运动、吸烟者、饮酒者单独列列。

回答

您可以names_patternpivot_longer.

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


以上是在R(dplyr)中使用多个变量将宽数据重塑为long的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>