【问题标题】:Missing prefix in pivot_longer with paired columns带有成对列的 pivot_longer 中缺少前缀
【发布时间】:2020-09-18 08:25:23
【问题描述】:

我有一个带有一系列成对列的“宽”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】:

    如果我们可以用rename_at 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
    

    【讨论】:

    • 我应该自己找到的明显解决方案。我不得不将其反转为“不匹配”,因为在我的原始数据集中我不仅有“开始”和“结束”,而且一切正常完美的。非常感谢。
    猜你喜欢
    • 2022-09-26
    • 2021-07-10
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2016-08-05
    • 1970-01-01
    相关资源
    最近更新 更多