【问题标题】:Pivot_longer() in R without separator?R中的Pivot_longer()没有分隔符?
【发布时间】:2021-02-15 19:07:59
【问题描述】:

我正在尝试使用 R 中的 pivot_longer() 来转换表格。但是分隔不是通过任何常见的符号,例如“_”或“。”而是通过列名的结束方式(“B”或“T”)。我尝试使用正则表达式,但没有多大成功。

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

原表:

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

希望输出表是:

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

【问题讨论】:

    标签: r dplyr data-wrangling


    【解决方案1】:

    我们可以在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))
    

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多