[英]Reshape time series data from wide to long for multiple variables
I'm working with time series data in wide(ish) format for many columns that all have the format "T1_v1_slow"..."T4_v1_slow" and "T1_v1_fast"..."T4_v1_fast".我正在处理许多格式为“T1_v1_slow”...“T4_v1_slow”和“T1_v1_fast”...“T4_v1_fast”的列的宽(ish)格式的时间序列数据。 There are 42 variables with this format in total.这种格式共有 42 个变量。 I'm trying to use pivot_longer
to return each variable as a column (eg, "v1_total", "v1_Vig), with a single column for time. Example data below:我正在尝试使用pivot_longer
将每个变量作为一列返回(例如,“v1_total”、“v1_Vig”),其中包含一个时间列。示例数据如下:
ParticipantNumber参加人数 | T1_v1_total T1_v1_total | T2_v1_total T2_v1_total | T3_v1_total T3_v1_total | T4_v1_total T4_v1_total | T1_v1_Vig T1_v1_Vig | T2_v1_Vig T2_v1_Vig | T3_v1_Vig T3_v1_Vig | T4_v1_Vig T4_v1_Vig |
---|---|---|---|---|---|---|---|---|
1 1个 | 41 41 | 47 47 | 45 45 | 28 28 | 8 8个 | 5 5个 | 8 8个 | 11 11 |
2 2个 | 16 16 | 25 25 | -4 -4 | -4 -4 | 11 11 | 10 10 | 18 18 | 17 17 |
I can get the data in truly long format using我可以使用真正的长格式获取数据
data %>%
pivot_longer(-ParticipantNumber) %>%
separate(name, into = c("time", "name"), sep = 3)
Output Output
ParticipantNumber参加人数 | time时间 | name名称 | value价值 |
---|---|---|---|
1 1个 | T1_ T1_ | v1_total v1_total | 41 41 |
1 1个 | T2_ T2_ | v1_total v1_total | 47 47 |
1 1个 | T3_ T3_ | v1_total v1_total | 45 45 |
1 1个 | T4_ T4_ | v1_total v1_total | 28 28 |
1 1个 | T1_ T1_ | v1_Vig v1_Vig | 8 8个 |
1 1个 | T2_ T2_ | v1_Vig v1_Vig | 5 5个 |
1 1个 | T3_ T3_ | v1_Vig v1_Vig | 8 8个 |
1 1个 | T4_ T4_ | v1_Vig v1_Vig | 11 11 |
2 2个 | T1_ T1_ | v1_total v1_total | 16 16 |
2 2个 | T2_ T2_ | v1_total v1_total | 25 25 |
2 2个 | T3_ T3_ | v1_total v1_total | -4 -4 |
2 2个 | T4_ T4_ | v1_total v1_total | -4 -4 |
2 2个 | T1_ T1_ | v1_Vig v1_Vig | 11 11 |
2 2个 | T2_ T2_ | v1_Vig v1_Vig | 10 10 |
2 2个 | T3_ T3_ | v1_Vig v1_Vig | 18 18 |
2 2个 | T4_ T4_ | v1_Vig v1_Vig | 17 17 |
I can't use sep = "_"
because I don't want to grab the second _
.我不能使用sep = "_"
因为我不想获取第二个_
。 My desired output is:我想要的 output 是:
ParticipantNumber参加人数 | time时间 | v1_Vig v1_Vig | v1_total v1_total |
---|---|---|---|
1 1个 | T1_ T1_ | 8 8个 | 41 41 |
1 1个 | T2_ T2_ | 5 5个 | 47 47 |
1 1个 | T3_ T3_ | 8 8个 | 45 45 |
1 1个 | T4_ T4_ | 5 5个 | 28 28 |
2 2个 | T1_ T1_ | 11 11 | 16 16 |
2 2个 | T2_ T2_ | 10 10 | 25 25 |
2 2个 | T3_ T3_ | 18 18 | -4 -4 |
2 2个 | T4_ T4_ | 17 17 | -4 -4 |
data.frame(
ParticipantNumber = c(1L, 2L),
T1_v1_total = c(41L, 16L),
T2_v1_total = c(47L, 25L),
T3_v1_total = c(45L, -4L),
T4_v1_total = c(28L, -4L),
T1_v1_Vig = c(8L, 11L),
T2_v1_Vig = c(5L, 10L),
T3_v1_Vig = c(8L, 18L),
T4_v1_Vig = c(11L, 17L)
) %>%
pivot_longer(-ParticipantNumber, names_to = c("time", ".value"), names_pattern = "(.)_(.*)")
## A tibble: 8 × 4
# ParticipantNumber time v1_total v1_Vig
# <int> <chr> <int> <int>
#1 1 1 41 8
#2 1 2 47 5
#3 1 3 45 8
#4 1 4 28 11
#5 2 1 16 11
#6 2 2 25 10
#7 2 3 -4 18
#8 2 4 -4 17
Simply use pivot_wider只需使用 pivot_wider
data %>%
pivot_longer(-ParticipantNumber) %>%
separate(name, into = c("time", "name"), sep = 3) %>%
pivot_wider(values_fn=sum)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.