在R中使用pivot longer堆叠多个列

在R中使用pivot longer堆叠多个列,r,dataframe,pivot,spatial,tidyr,R,Dataframe,Pivot,Spatial,Tidyr,我正在尝试使用pivot_将r上的数据从宽变长。这里似乎有一些人有类似的问题,但我无法根据我的数据调整他们的解决方案。我在宽数据示例中附上了示例数据的图片,以及我在长数据示例中试图实现的目标 总之,我有一个时间和参考列,它指的是所有列,我还有多个列,分别是group、subject、ID、xcoordinate和ycoordinate,形式如下: 第1组,受试者1。ID1、xcoord1、ycoord1、group2、subject2、ID2、xcoord2、ycoord2等等。。。我想要的是一

我正在尝试使用pivot_将r上的数据从宽变长。这里似乎有一些人有类似的问题,但我无法根据我的数据调整他们的解决方案。我在宽数据示例中附上了示例数据的图片,以及我在长数据示例中试图实现的目标

总之,我有一个时间和参考列,它指的是所有列,我还有多个列,分别是group、subject、ID、xcoordinate和ycoordinate,形式如下: 第1组,受试者1。ID1、xcoord1、ycoord1、group2、subject2、ID2、xcoord2、ycoord2等等。。。我想要的是一个包含列的长表:

时间、参考、组、主题、ID、xcoord、ycoord

5列堆叠各自的编号列,时间列和参考列在相关堆栈中重复

 df %>%
 pivot_longer(cols = -c(time, reference),
names_to = c("group", "subject", "ID", "xcoord", "ycoord")
我的理解是,我需要使用names_pattern函数,尽管我似乎无法让它工作,而且我找不到任何明确的描述我应该如何使用它的内容。我应该说我的数据比示例数据宽得多,所以不能真正依赖于列的编号

谢谢你的帮助

宽数据示例

    time reference group1 subject1 ID1 xcoord1 ycoord1 group2 subject2 ID2 xcoord2 ycoord2 group3 subject3 ID3 xcoord3 ycoord3
1  00:01   4097365      1        4   1    7.44   38.16      0       21   2   33.90   47.26      1       15   3   21.53    2.67
2  00:02   4097366      1        4   1    9.84   37.03      0       21   2   32.98   48.47      1       15   3   21.82    2.95
3  00:03   4097367      1        4   1   12.01   35.83      0       21   2   30.17   50.33      1       15   3   22.06    4.45
4  00:04   4097368      1        4   1   12.15   34.17      0       21   2   29.85   50.52      1       15   3   23.50    4.75
5  00:05   4097369      1        4   1   15.27   32.94      0       21   2   28.39   51.30      1       15   3   24.25    4.76
6  00:06   4097370      1        4   1   18.96   31.98      0       21   2   28.39   52.36      1       15   3   25.31    6.57
7  00:07   4097371      1        4   1   22.50   31.13      0       21   2   26.59   53.14      1       15   3   26.05    7.04
8  00:08   4097372      1        4   1   27.47   30.15      0       21   2   25.89   53.94      1       15   3   27.29    7.91
9  00:09   4097373      1        4   1   32.17   29.92      0       21   2   24.64   54.42      1       15   3   27.47    8.44
10 00:10   4097374      1        4   1   33.77   27.49      0       21   2   24.61   55.23      1       15   3   28.59    8.71
长数据示例

   time reference group subject ID xcoord ycoord
1  00:01   4097365     1       4  1   7.44  38.16
2  00:01   4097365     0      21  2  33.90  47.26
3  00:01   4097365     1      15  3  21.53   2.67
4  00:02   4097366     1       4  1   9.84  37.03
5  00:02   4097367     0      21  2  32.98  48.47
6  00:02   4097368     1      15  3  21.82   2.95
7  00:03   4097369     1       4  1  12.01  35.83
8  00:03   4097370     0      21  2  30.17  50.33
9  00:03   4097371     1      15  3  22.06   4.45
10 00:04   4097372     1       4  1  12.15  34.17
编辑:我已经设法实现了这个奇怪的解决方案,它是长数据和宽数据的混合体

dput(头部(df1))

代码生成的数据帧如下所示

> head(df1)
# A tibble: 6 x 24
   time state reference num   group X        ID subect     x     y speed group1   ID1 subect1    x1    y1 speed1 group2   ID2 subect2    x2    y2 speed2
  <dbl> <fct> <chr>     <chr> <chr> <lgl> <int>  <int> <int> <int> <chr> <chr>  <int>   <int> <int> <int> <chr>  <chr>  <int>   <int> <int> <int> <chr> 
1     0 Aliv~ 1880439   1     1     NA        1     21  3514 -1644 5.23  0         13       9   882 -1468 1.70   4         24      -1  5550  4400 0.00  
2     0 Aliv~ 1880439   NA    NA    NA       NA     NA    NA    NA NA    NA        NA      NA    NA    NA NA     NA        NA      NA    NA    NA NA    
3     0 Aliv~ 1880439   2     1     NA        2      7  2807  -510 3.24  4         14      -1  5550  4400 0.00   0         25       1  5031   -74 0.54  
4     0 Aliv~ 1880439   3     4     NA        4     -1  5550  4400 0.00  1         15      13  3004  1633 3.06   1         26      18  3936   190 1.06  
5     0 Aliv~ 1880439   4     0     NA        5      2  3956  1297 2.31  1         16      14   761   559 2.92   0         27       5  3972   686 0.95  
6     0 Aliv~ 1880439   5     0     NA        6      6  3686   -55 3.57  0         17      11  3317  1443 3.30   0         28      10  3623   356 2.49  
# ... with 1 more variable: speed.group2 <lgl>
>头部(df1)
#一个tibble:6x24
时间状态参考编号组X ID子组X y速度组1 ID1子组1 x1 y1速度组2 ID2子组2 x2 y2速度2
1 0 Aliv~1880439 1 1 NA 1 21 3514-1644 5.23 0 13 9 882-1468 1.70 4 24-1 5550 4400.00
2 0 Aliv~1880439 NA NA NA NA NA NA NA NA NA NA NA NA
3 0 Aliv~1880439 2 1 NA 2 7 2807-510 3.24 4 14-1 5550 4400.00 0 25 1 5031-74 0.54
4 0 Aliv~1880439 3 4 NA 4-1 5550 4400.00 1 15 13 3004 1633.06 1 26 18 3936 190 1.06
5 0 Aliv~1880439 4 0 NA 5 2 3956 1297 2.31 1 16 14 761 559 2.92 0 27 5 3972 686 0.95
6 0 Aliv~1880439 5 0 NA 6 6 3686-55 3.57 0 17 11 3317 1443 3.30 0 28 10 3623 356 2.49
# ... 还有一个变量:speed.group2

将首先重命名列并在数字前插入下划线,然后在
透视中使用下划线作为分隔符

library(tidyverse)

df %>%
  rename_at(-c(1:2), ~ str_replace(., "(\\w+)(\\d)", "\\1_\\2")) %>% 
  pivot_longer(cols = -c(1:2), names_to = c(".value", "num"), names_sep = "_")
编辑(2/7/20):

对于更新的数据集,某些变量列名的末尾似乎没有数字。我们可以为这些添加
0

另外,我假设您想要:
ID
子部分
x
y
速度
,重复(第5列中的第一个
,与第7-11列中的相关变量分离)

输出(修订):

#一个tible:18x13
时间状态参考num X speed.group2 val组ID子项X y speed
10活着;:1880439 1 NA 01 21 3514-1644 5.23
20活着;:1880439 1 NA 10 13 9 882-1468 1.70
30活着;:1880439 1 NA 2 4 24-15550 4400.00
40活着的人1880439钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
5.0活着;:1880439钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
6.0活着;:1880439钠钠钠钠钠钠钠钠钠钠钠钠钠钠钠
70活着的1880439 2 NA 0 1 2 7 2807-510 3.24
8.0活着;:1880439 2 NA 14-15550 4400.00
9.0活着;:1880439 2 NA 2 0 25 1 5031-74 0.54
10 0活着;:1880439 3 NA 04-15550 4400.00
11.0活着;:1880439 3 NA 11 15 13 3004 1633.06
12 0活着;:1880439 3 NA 2 1 26 18 3936 190 1.06
13 0活着;:1880439 4 NA 0 5 2 3956 1297 2.31
14.0活着;:1880439 4 NA 11 16 14 761 559 2.92
15.0活着;:1880439 4 NA 2 0 27 5 3972 686 0.95
16.0活着;:1880439 5 NA 0 6 6 3686-55 3.57
17.0活着;:1880439 5 NA 10 17 11 3317 1443 3.30
18 0活着;:1880439 5 NA 2 0 28 10 3623 356 2.49

将首先重命名列并在数字前插入下划线,然后在
透视中使用下划线作为分隔符

library(tidyverse)

df %>%
  rename_at(-c(1:2), ~ str_replace(., "(\\w+)(\\d)", "\\1_\\2")) %>% 
  pivot_longer(cols = -c(1:2), names_to = c(".value", "num"), names_sep = "_")
编辑(2/7/20):

对于更新的数据集,某些变量列名的末尾似乎没有数字。我们可以为这些添加
0

另外,我假设您想要:
ID
子部分
x
y
速度
,重复(第5列中的第一个
,与第7-11列中的相关变量分离)

输出(修订):

#一个tible:18x13
时间状态参考num X speed.group2 val组ID子项X y speed
10活着;:1880439
df1 %>%
  rename_at(c(5,7:11), ~ paste0(., "0")) %>%
  rename_at(-c(1:4, 6, 24), ~ str_replace(., "(\\w+)(\\d+)", "\\1_\\2")) %>%
  pivot_longer(cols = -c(1:4, 6, 24), names_to = c(".value", "val"), names_sep = "_")
# A tibble: 18 x 13
    time state   reference num   X     speed.group2 val   group    ID subect     x     y speed
   <dbl> <fct>   <chr>     <chr> <lgl> <lgl>        <chr> <chr> <int>  <int> <int> <int> <chr>
 1     0 Alive;: 1880439   1     NA    NA           0     1         1     21  3514 -1644 5.23 
 2     0 Alive;: 1880439   1     NA    NA           1     0        13      9   882 -1468 1.70 
 3     0 Alive;: 1880439   1     NA    NA           2     4        24     -1  5550  4400 0.00 
 4     0 Alive;: 1880439   NA    NA    NA           0     NA       NA     NA    NA    NA NA   
 5     0 Alive;: 1880439   NA    NA    NA           1     NA       NA     NA    NA    NA NA   
 6     0 Alive;: 1880439   NA    NA    NA           2     NA       NA     NA    NA    NA NA   
 7     0 Alive;: 1880439   2     NA    NA           0     1         2      7  2807  -510 3.24 
 8     0 Alive;: 1880439   2     NA    NA           1     4        14     -1  5550  4400 0.00 
 9     0 Alive;: 1880439   2     NA    NA           2     0        25      1  5031   -74 0.54 
10     0 Alive;: 1880439   3     NA    NA           0     4         4     -1  5550  4400 0.00 
11     0 Alive;: 1880439   3     NA    NA           1     1        15     13  3004  1633 3.06 
12     0 Alive;: 1880439   3     NA    NA           2     1        26     18  3936   190 1.06 
13     0 Alive;: 1880439   4     NA    NA           0     0         5      2  3956  1297 2.31 
14     0 Alive;: 1880439   4     NA    NA           1     1        16     14   761   559 2.92 
15     0 Alive;: 1880439   4     NA    NA           2     0        27      5  3972   686 0.95 
16     0 Alive;: 1880439   5     NA    NA           0     0         6      6  3686   -55 3.57 
17     0 Alive;: 1880439   5     NA    NA           1     0        17     11  3317  1443 3.30 
18     0 Alive;: 1880439   5     NA    NA           2     0        28     10  3623   356 2.49