【问题标题】:R function to divide a character vector into prefix + string if the prefix is present如果存在前缀,R函数将字符向量划分为前缀+字符串
【发布时间】:2021-11-30 01:23:51
【问题描述】:

我有一个这样的字符向量:

id <-c("A01A01", "A01B01", "A01C01", "R", "S", "T")

我需要从包含它的所有字符串中删除一个前缀,保留所有子字符串 然后我的预期输出是其他 2 个向量,如下所示:

a <-c("A01", "A01", "A01", "", "", "")

b <-c("A01", "B01", "C01", "R", "S", "T")

【问题讨论】:

    标签: r string split


    【解决方案1】:

    extract 的选项来自tidyr

    library(tidyr)
    library(dplyr)
    tibble(id) %>% 
       extract(id, into = c('a', 'b'), '(A01)?(.*)')
    # A tibble: 6 × 2
      a     b    
      <chr> <chr>
    1 "A01" A01  
    2 "A01" B01  
    3 "A01" C01  
    4 ""    R    
    5 ""    S    
    6 ""    T    
    

    【讨论】:

      【解决方案2】:

      您可以使用sub 喜欢:

      sub("^(A01).*|.*", "\\1", id)
      #[1] "A01" "A01" "A01" ""    ""    ""   
      
      sub("^A01", "", id)
      #[1] "A01" "B01" "C01" "R"   "S"   "T"  
      

      ^(A01).*|.* 在开头或所有内容中匹配 A01,如果匹配,\\1 插入 A01

      另一种选择是查看strsplit

      strsplit(id, "(?<=^A01)", perl=TRUE)
      

      【讨论】:

        【解决方案3】:

        这行得通吗:

        a <- sapply(id, function(x) if(nchar(x)%%2 == 0) substr(x, 1,nchar(x)/2) else '', USE.NAMES = FALSE)
        b <- sapply(id, function(x) if(nchar(x)%%2 == 0) substr(x,nchar(x)/2+1, nchar(x)) else x,USE.NAMES = FALSE)
        a
        [1] "A01" "A01" "A01" ""    ""    ""   
        b
        [1] "A01" "B01" "C01" "R"   "S"   "T"  
        

        【讨论】:

          猜你喜欢
          • 2018-06-19
          • 2016-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-25
          • 1970-01-01
          • 2012-07-09
          • 1970-01-01
          相关资源
          最近更新 更多