简体   繁体   English

为多个变量重塑时间序列数据,从宽到长

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM