r - R 中没有分隔符的 Pivot_longer()?

标签 r dplyr data-wrangling

我正在尝试使用 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

最佳答案

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

关于r - R 中没有分隔符的 Pivot_longer()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66213981/

相关文章:

r - 在 R w/PLYR 中提取组回归系数

r - R 中可逆对的计数

r - 如何从冲突的年龄类别中计算数字年龄?

r - dplyr 分组并使用多列的条件

r - 情节标题、标签等中的字符串和表达式

R 文档,如何在数学模式下,在院长方程中以粗体设置字符?

r - 如何正确组合 mutate 和 str_match?

r - 使用嵌套 ifelse 条件通过 mutate 添加列

r - 不能在 dplyr 中使用 !!arg 进行 mutate 调用

stata - 根据最近的 I/观察生成变量