dplyr:旋转更长,同时保持一些宽/堆叠

问题描述 投票:0回答:0

我正在尝试将宽数据集转换为长数据集,但通过此处搜索无法找到问题的解决方案。我有一个广泛的数据集,其中包括 3 轮中的 3 个友谊提名,然后是关于每轮中每个提名的 3 个后续问题。下面的示例数据显示了结构。后续问题是其中包含 a、b 或 c 的问题,其数字对应于该 Wave 的好友列(例如,w1a1 是好友 1 (w1fid1) 的第 1 波后续问题)。我已经包含了我拥有的和我想要的样本数据集:

样本数据:

df<-read.table(text= "id    w1fid1  w1fid2  w1fid3  w2fid1  w2fid2  w2fid3  w3fid1  w3fid2  w3fid3  w1a1    w1a2    w1a3    w1b1    w1b2    w1b3    w1c1    w1c2    w1c3    w2a1    w2a2    w2a3    w2b1    w2b2    w2b3    w2c1    w2c2    w2c3    w3a1    w3a2    w3a3    w3b1    w3b2    w3b3    w3c1    w3c2    w3c3
1   10  3   9   4   13  9   15  14  NA  1   1   0   0   1   0   1   0   0   1   1   1   1   0   0   1   1   1   1   1   NA  1   0   NA  0   0   NA
2   13  NA  20  4   18  19  12  10  8   1   NA  0   0   NA  0   0   NA  0   1   0   0   1   1   0   0   1   0   0   0   0   1   0   0   1   0   0
3   NA  9   19  19  8   20  17  9   2   NA  1   1   NA  0   0   NA  0   0   0   0   1   0   0   0   1   0   0   0   0   1   0   0   0   1   1   0
4   13  19  9   19  16  2   2   11  14  1   1   1   1   1   1   1   1   0   0   0   1   0   0   1   0   0   0   0   0   0   0   0   1   0   1   0
5   11  8   9   18  20  7   9   17  12  0   1   1   0   0   0   1   1   1   1   0   1   1   1   0   1   0   1   1   0   0   1   1   1   0   1   0", header = TRUE)

所需输出:

df <- read.table(text= "id   wave   fid a   b   c
1   1   10  1   0   1
1   1   3   1   1   0
1   1   9   0   0   0
1   2   4   1   1   1
1   2   13  1   0   1
1   2   9   1   0   1
1   3   15  1   1   0
1   3   14  1   0   0
1   3   NA  NA  NA  NA
2   1   14  1   0   0
2   1   NA  NA  NA  NA
2   1   20  0   0   0
2   2   4   1   1   0
2   2   18  0   1   1
2   2   19  0   0   0
2   3   12  0   1   1
2   3   10  0   0   0
2   3   8   0   0   0
3   1   NA  NA  NA  NA
3   1   9   1   0   0
3   1   19  1   0   0
3   2   19  0   0   1
3   2   8   0   0   0
3   2   20  1   0   0
3   3   17  0   0   1
3   3   9   0   0   1
3   3   2   1   0   0
4   1   13  1   1   1
4   1   19  1   1   1
4   1   9   1   1   0
4   2   19  0   0   0
4   2   16  0   0   0
4   2   2   1   1   0
4   3   2   0   0   0
4   3   11  0   0   1
4   3   14  0   1   0
5   1   11  0   0   1
5   1   8   1   0   1
5   1   9   1   0   1
5   2   18  1   1   1
5   2   20  0   1   0
5   2   7   1   0   1
5   3   9   1   1   0
5   3   17  0   1   1
5   3   12  0   1   0", header = TRUE)

我用过这个代码:

df %>% pivot_longer(-id, 
                     names_to = c('wave', 'type', '.value'),
                     names_pattern = "(\\w+\\d+)(\\w+)(\\d+)") 

这给了我这个:

id wave  type    `1`   `2`   `3`
1 w1    fid      10     3     9
1 w2    fid       4    13     9
1 w3    fid      15    14    NA
1 w1    a         1     1     0
1 w1    b         0     1     0
1 w1    c         1     0     0
1 w2    a         1     1     1
1 w2    b         1     0     0
1 w2    c         1     1     1
1 w3    a         1     1    NA
1 w3    b         1     0    NA
1 w3    c         0     0    NA
2 w1    fid      13    NA    20
2 w2    fid       4    18    19
2 w3    fid      12    10     8
2 w1    a         1    NA     0
2 w1    b         0    NA     0
2 w1    c         0    NA     0
2 w2    a         1     0     0
2 w2    b         1     1     0
2 w2    c         0     1     0
2 w3    a         0     0     0
2 w3    b         1     0     0
2 w3    c         1     0     0
3 w1    fid      NA     9    19
3 w2    fid      19     8    20
3 w3    fid      17     9     2
3 w1    a        NA     1     1
3 w1    b        NA     0     0
3 w1    c        NA     0     0
3 w2    a         0     0     1
3 w2    b         0     0     0
3 w2    c         1     0     0
3 w3    a         0     0     1
3 w3    b         0     0     0
3 w3    c         1     1     0
4 w1    fid      13    19     9
4 w2    fid      19    16     2
4 w3    fid       2    11    14
4 w1    a         1     1     1
4 w1    b         1     1     1
4 w1    c         1     1     0
4 w2    a         0     0     1
4 w2    b         0     0     1
4 w2    c         0     0     0
4 w3    a         0     0     0
4 w3    b         0     0     1
4 w3    c         0     1     0
5 w1    fid      11     8     9
5 w2    fid      18    20     7
5 w3    fid       9    17    12
5 w1    a         0     1     1
5 w1    b         0     0     0
5 w1    c         1     1     1
5 w2    a         1     0     1
5 w2    b         1     1     0
5 w2    c         1     0     1
5 w3    a         1     0     0
5 w3    b         1     1     1
5 w3    c         0     1     0

我假设我必须重写names_to和names_pattern才能得到我想要的东西,但我坚持正确的语法才能到达那里。

r dplyr pivot data-manipulation
© www.soinside.com 2019 - 2024. All rights reserved.