【问题标题】:How to separate a column in dplyr based on regex如何基于正则表达式在 dplyr 中分离一列
【发布时间】:2018-02-19 05:16:07
【问题描述】:

我有以下数据框:

df <- structure(list(X2 = c("BB_137.HVMSC", "BB_138.combined.HVMSC", 
"BB_139.combined.HVMSC", "BB_140.combined.HVMSC", "BB_141.HVMSC", 
"BB_142.combined.HMSC-bm")), .Names = "X2", row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

看起来像这样

> df
# A tibble: 6 x 1
                       X2
                    <chr>
1            BB_137.HVMSC
2   BB_138.combined.HVMSC
3   BB_139.combined.HVMSC
4   BB_140.combined.HVMSC
5            BB_141.HVMSC
6 BB_142.combined.HMSC-bm

我想要做的是分成两列(. 作为分隔符),将最后一个字段保留为第二列

              col1 col2
            BB_137 HVMSC
   BB_138.combined HVMSC
   BB_139.combined HVMSC
   BB_140.combined HVMSC
            BB_141 HVMSC
   BB_142.combined HMSC-bm

正确的做法是什么?

我的尝试是这样的:

> df %>% separate(X2, into = c("sid","status", "tiss"), sep = "[.]") 
# A tibble: 6 x 3
     sid   status    tiss
*  <chr>    <chr>   <chr>
1 BB_137    HVMSC    <NA>
2 BB_138 combined   HVMSC
3 BB_139 combined   HVMSC
4 BB_140 combined   HVMSC
5 BB_141    HVMSC    <NA>
6 BB_142 combined HMSC-bm

警告信息: 2 个位置的值太少:1、5

【问题讨论】:

    标签: r regex dplyr tidyverse


    【解决方案1】:

    我们也可以使用 tidyr::extract()

    extract(df, X2, c("col1","col2"), "(.*)\\.(H.*)")
    

    【讨论】:

      【解决方案2】:

      我们可以在分离函数中使用负前瞻作为分隔符。

      library(tidyr)
      separate(data = df, col = X2, into = c("col1", "col2"), sep = "(\\.)(?!.*\\.)")
      
      #            col1    col2
      #           <chr>   <chr>
      #1          BB_137   HVMSC
      #2 BB_138.combined   HVMSC
      #3 BB_139.combined   HVMSC
      #4 BB_140.combined   HVMSC
      #5          BB_141   HVMSC
      #6 BB_142.combined HMSC-bm
      

      正则表达式取自this 答案。

      【讨论】:

      • 哦,天哪...负前瞻。每次我认为我已经涵盖了正则表达式时,我都会学到一些新东西。
      猜你喜欢
      • 2020-11-14
      • 2018-06-17
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2014-12-10
      • 2021-11-20
      相关资源
      最近更新 更多