使用变量块旋转更长的时间

问题描述

我在变量块上使用 pivot_longer 时遇到问题。假设我有这个:

enter image description here


我想要这个:

enter image description here

dfwide <- structure(list(date = structure(c(1577836800,1577923200,1578009600,1578096000,1578182400,1578268800),class = c("POSIXct","POSIXt"
),tzone = "UTC"),x1_a = c(20,15,12,NA,25,27),x1_b = c(33,44,85,10,3),x1_c = c(70,20,87,11,5),x2_a = c(85,65,33,46,82,9),x2_b = c(87,55,64,98,x2_c = c(77,51,92,37,98)),row.names = c(NA,-6L),class = c("tbl_df","tbl","data.frame")) 

##Tried:
dfwide %>% 
  pivot_longer(cols = -date,names_sep = c("x1","x2"),names_to = c("a","b","c"),values_to = "value")

解决方法

这一行利用了 pivot_longer 函数的名称分隔选项。

pivot_longer(dfwide,-date,names_sep = "_",names_to=c("which",".value")) %>% 
   arrange(which)


    # A tibble: 12 x 5
   date                which     a     b     c
   <dttm>              <chr> <dbl> <dbl> <dbl>
 1 2020-01-01 00:00:00 x1       20    33    70
 2 2020-01-02 00:00:00 x1       15    44    20
 3 2020-01-03 00:00:00 x1       12    85    87
 4 2020-01-04 00:00:00 x1       NA    10    11
 5 2020-01-05 00:00:00 x1       25    12    20
 6 2020-01-06 00:00:00 x1       27     3     5
 7 2020-01-01 00:00:00 x2       85    87    77
 8 2020-01-02 00:00:00 x2       65    25    51
 9 2020-01-03 00:00:00 x2       33    55    92
10 2020-01-04 00:00:00 x2       46    64    20
11 2020-01-05 00:00:00 x2       82    98    37
12 2020-01-06 00:00:00 x2        9     5    98
,

如果您可以在多个步骤中完成此操作,则此方法有效。首先收集列,用下划线分隔,然后展开值。

pivot_longer(dfwide,x1_a:x2_c,names_to="which") %>% 
  extract(which,into=c("var","letter"),regex="(.*)_(.*)") %>%
  pivot_wider(names_from=letter,values_from=value)
,

你可以试试这个代码:

library(tidyverse)
dfwide %>% 
  pivot_longer(cols = -date,names_to = "which",values_to = "value") %>%
  separate(which,into = c("which",sep = "_") %>%
  pivot_wider(names_from = "letter",values_from = "value") %>%
  arrange(which)

结果如下:

# A tibble: 12 x 5
   date                which     a     b     c
   <dttm>              <chr> <dbl> <dbl> <dbl>
 1 2020-01-01 00:00:00 x1       20    33    70
 2 2020-01-02 00:00:00 x1       15    44    20
 3 2020-01-03 00:00:00 x1       12    85    87
 4 2020-01-04 00:00:00 x1       NA    10    11
 5 2020-01-05 00:00:00 x1       25    12    20
 6 2020-01-06 00:00:00 x1       27     3     5
 7 2020-01-01 00:00:00 x2       85    87    77
 8 2020-01-02 00:00:00 x2       65    25    51
 9 2020-01-03 00:00:00 x2       33    55    92
10 2020-01-04 00:00:00 x2       46    64    20
11 2020-01-05 00:00:00 x2       82    98    37
12 2020-01-06 00:00:00 x2        9     5    98