Pivot_longer() 在 R 中没有分隔符?

Pivot_longer() in R without separator?

我正在尝试在 R 中使用 pivot_longer() 转换 table。但是分隔不是通过任何常见符号(例如“_”) “ 要么 ”。”而是列名称的结尾方式(“B”或“T”)。我尝试使用正则表达式,但不太成功。

下面是原始示例 table 以及我希望最终转换后的 table 的样子。非常感谢您的帮助。

原文table:

tibble(Datetime = seq(as.Date("2000/1/1"), by = "month", length.out = 10), 
           `ABC1-P1B` = seq(1,10),
           `ABC1-P1T` = seq(101,110),
           `ABC1-P2B` = seq(11,20),
           `ABC1-P2T` = seq(201,210))
# A tibble: 10 x 5
   Datetime   `ABC1-P1B` `ABC1-P1T` `ABC1-P2B` `ABC1-P2T`
   <date>          <int>      <int>      <int>      <int>
 1 2000-01-01          1        101         11        201
 2 2000-02-01          2        102         12        202
 3 2000-03-01          3        103         13        203
 4 2000-04-01          4        104         14        204
 5 2000-05-01          5        105         15        205
 6 2000-06-01          6        106         16        206
 7 2000-07-01          7        107         17        207
 8 2000-08-01          8        108         18        208
 9 2000-09-01          9        109         19        209
10 2000-10-01         10        110         20        210

希望输出 table 为:

tibble(Datetime = c(seq(as.Date("2000/1/1"), by = "month", length.out = 10),
                    seq(as.Date("2000/1/1"), by = "month", length.out = 10)), 
       `ID` = rep(c("ABC1-P1", "ABC1-P2"),10),
       `B` = c(seq(1,10), seq(11,20)),
       `T` = c(seq(101,110), seq(201,210))
      )

# A tibble: 20 x 4
   Datetime   ID          B     T
   <date>     <chr>   <int> <int>
 1 2000-01-01 ABC1-P1     1   101
 2 2000-02-01 ABC1-P2     2   102
 3 2000-03-01 ABC1-P1     3   103
 4 2000-04-01 ABC1-P2     4   104
 5 2000-05-01 ABC1-P1     5   105
 6 2000-06-01 ABC1-P2     6   106
 7 2000-07-01 ABC1-P1     7   107
 8 2000-08-01 ABC1-P2     8   108
 9 2000-09-01 ABC1-P1     9   109
10 2000-10-01 ABC1-P2    10   110
11 2000-01-01 ABC1-P1    11   201
12 2000-02-01 ABC1-P2    12   202
13 2000-03-01 ABC1-P1    13   203
14 2000-04-01 ABC1-P2    14   204
15 2000-05-01 ABC1-P1    15   205
16 2000-06-01 ABC1-P2    16   206
17 2000-07-01 ABC1-P1    17   207
18 2000-08-01 ABC1-P2    18   208
19 2000-09-01 ABC1-P1    19   209
20 2000-10-01 ABC1-P2    20   210

我们可以在 names_sep

中指定正则表达式环视
library(dplyr)
library(tidyr)
df1 %>% 
   pivot_longer(cols = -Datetime, names_to = c("ID", '.value'),
          names_sep = "(?<=\d)(?=[A-Z]$)")

-输出

# A tibble: 10 x 4
#   Datetime   ID          B     T
#   <date>     <chr>   <int> <int>
# 1 2000-01-01 ABC1-P1     1   101
# 2 2000-02-01 ABC1-P1     2   102
# 3 2000-03-01 ABC1-P1     3   103
# 4 2000-04-01 ABC1-P1     4   104
# 5 2000-05-01 ABC1-P1     5   105
# 6 2000-06-01 ABC1-P1     6   106
# 7 2000-07-01 ABC1-P1     7   107
# 8 2000-08-01 ABC1-P1     8   108
# 9 2000-09-01 ABC1-P1     9   109
#10 2000-10-01 ABC1-P1    10   110

数据

df1 <- tibble(Datetime = seq(as.Date("2000/1/1"), by = "month", length.out = 10), 
           `ABC1-P1B` = seq(1,10),
           `ABC1-P1T` = seq(101,110))