pivot_longer中缺少带有成对列的前缀

问题描述 投票:1回答:1

我有一个带有一系列成对列的“宽” data.frame。我的目标是使用pivot_longer取消透视。在所有列中都有前缀的成对列有很多帮助。但是在我的情况下,即使有可能,也只有其中一半有前缀,而且我也不知道如何定义“ names_pattern”。

在下面的示例中,所有成对的列都有一个前缀,可以使用pivot_longer的names_pattern属性对其进行拆分:

df_wide <- tribble(
  ~id , ~f_start , ~d_start , ~f_end , ~d_end ,
  'A' , 'p' , '2018-01-01' , 'p' , '2018-02-01' ,
  'B' , 'i' , '2019-04-01' , 'p' , '2020-01-01' ,
  'C' , 'i' , '2018-06-01' , 'i' , '2019-03-01' ,
  'D' , 'p' , '2019-12-01' , 'p' , '2020-05-01' ,
  'E' , 'p' , '2019-02-01' , 'p' , '2019-05-01' ,
  'F' , 'i' , '2018-04-01' , 'i' , '2018-07-01' ,
)

df_wide %>% 
  pivot_longer(-id ,
               names_to = c('.value' , 'status') ,
               names_pattern = '(.*)_(.*)'
               )

这将导致我的预期输出:

   id    status f     d         
   <chr> <chr>  <chr> <chr>     
 1 A     start  p     2018-01-01
 2 A     end    p     2018-02-01
 3 B     start  i     2019-04-01
 4 B     end    p     2020-01-01
 5 C     start  i     2018-06-01
 6 C     end    i     2019-03-01
 7 D     start  p     2019-12-01
 8 D     end    p     2020-05-01
 9 E     start  p     2019-02-01
10 E     end    p     2019-05-01
11 F     start  i     2018-04-01
12 F     end    i     2018-07-01

不幸的是,我的data.frame看起来像这样,在一对对中缺少前缀。

df_wide<- tribble(
  ~id , ~f_start , ~start , ~f_end , ~end ,
  'A' , 'p' , '2018-01-01' , 'p' , '2018-02-01' ,
  'B' , 'i' , '2019-04-01' , 'p' , '2020-01-01' ,
  'C' , 'i' , '2018-06-01' , 'i' , '2019-03-01' ,
  'D' , 'p' , '2019-12-01' , 'p' , '2020-05-01' ,
  'E' , 'p' , '2019-02-01' , 'p' , '2019-05-01' ,
  'F' , 'i' , '2018-04-01' , 'i' , '2018-07-01' ,
)

有人知道如何实现预期的输出吗?

提前感谢

r tidyr
1个回答
0
投票

如果我们可以rename缺少的前缀,则OP的解决方案将起作用

library(dplyr)
library(tidyr)
library(stringr)
df_wide %>%
     rename_at(vars(matches('^(start|end)')), ~ str_c('d_', .)) %>%
     pivot_longer(-id ,
               names_to = c('.value' , 'status') ,
               names_pattern = '(.*)_(.*)'
               )
# A tibble: 12 x 4
#   id    status f     d         
#   <chr> <chr>  <chr> <chr>     
# 1 A     start  p     2018-01-01
# 2 A     end    p     2018-02-01
# 3 B     start  i     2019-04-01
# 4 B     end    p     2020-01-01
# 5 C     start  i     2018-06-01
# 6 C     end    i     2019-03-01
# 7 D     start  p     2019-12-01
# 8 D     end    p     2020-05-01
# 9 E     start  p     2019-02-01
#10 E     end    p     2019-05-01
#11 F     start  i     2018-04-01
#12 F     end    i     2018-07-01
© www.soinside.com 2019 - 2024. All rights reserved.