在R中使用pivot longer堆叠多个列
我正在尝试使用pivot_将r上的数据从宽变长。这里似乎有一些人有类似的问题,但我无法根据我的数据调整他们的解决方案。我在宽数据示例中附上了示例数据的图片,以及我在长数据示例中试图实现的目标 总之,我有一个时间和参考列,它指的是所有列,我还有多个列,分别是group、subject、ID、xcoordinate和ycoordinate,形式如下: 第1组,受试者1。ID1、xcoord1、ycoord1、group2、subject2、ID2、xcoord2、ycoord2等等。。。我想要的是一个包含列的长表: 时间、参考、组、主题、ID、xcoord、ycoord 5列堆叠各自的编号列,时间列和参考列在相关堆栈中重复在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等等。。。我想要的是一
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