基于(“\\.”)的第二次出现在R中分隔列,

5uzkadbs  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(90)

我有一个很难分开我的列从数据集

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

tibble(sample=c("AM.F10.T1", "AM.F10.T2","DA.AD.1","DA.AD.2", "ES.AD.1"))
#> # A tibble: 5 × 1
#>   sample   
#>   <chr>    
#> 1 AM.F10.T1
#> 2 AM.F10.T2
#> 3 DA.AD.1  
#> 4 DA.AD.2  
#> 5 ES.AD.1

创建于2023-05-11带有reprex v2.0.2
让他们看起来

#>   sample        col1      col2
#>   <chr>    
#> 1 AM.F10.T1     AM.F10     T1
#> 2 AM.F10.T2     AM.F10     T2
#> 3 DA.AD.1       DA.AD       1
#> 4 DA.AD.2       DA.AD       2
#> 5 ES.AD.1       ES.AD       1

谢谢你花时间在我的岗位上

dxxyhpgq

dxxyhpgq1#

您可以使用tidyr::separate_wider_regex()来实现这一点(该函数在tidyr的最新版本中)。您可以明确第一列和第二列中的内容以及它们之间的分隔。

library(tidyr)
tibble(sample=c("AM.F10.T1", "AM.F10.T2","DA.AD.1","DA.AD.2", "ES.AD.1")) |> 
  separate_wider_regex(
     cols = sample, 
     patterns = c(first  = "\\w*\\.\\w*", "\\.", second = "\\w*")
  )
#> # A tibble: 5 × 2
#>   first  second
#>   <chr>  <chr> 
#> 1 AM.F10 T1    
#> 2 AM.F10 T2    
#> 3 DA.AD  1     
#> 4 DA.AD  2     
#> 5 ES.AD  1

创建于2023-05-11带有reprex v2.0.2

qcbq4gxm

qcbq4gxm2#

虽然tidyr包中的extract函数被separate_wider_regex取代,但我认为它有时仍然有用。
在第一个捕获组中使用主动匹配将迫使后一个捕获组获取第二个点之后的内容。

library(tidyr)

extract(df, sample, regex = "(.*)\\.(.*)", into = c("col1", "col2"), remove = F)

# A tibble: 5 × 3
  sample    col1   col2 
  <chr>     <chr>  <chr>
1 AM.F10.T1 AM.F10 T1   
2 AM.F10.T2 AM.F10 T2   
3 DA.AD.1   DA.AD  1    
4 DA.AD.2   DA.AD  2    
5 ES.AD.1   ES.AD  1

相关问题