代码之家  ›  专栏  ›  技术社区  ›  Cristian E. Nuno

将连续的非数字元素粘贴在一起

  •  1
  • Cristian E. Nuno  · 技术社区  · 6 年前

    在识别字符向量中满足非数字模式的元素之后,如何将那些连续满足非数字模式的元素粘贴在一起

    概述

    sample_text

    • 奇数元素:包含6位数字,后跟文本;
    • 偶数元素:包含后跟文本的4位数字。

    但是,有一些非数字文本属于它前面的奇数元素。

    以前,我不知道字符向量中有连续的非数字元素。这允许我手动将每个非数字元素粘贴到元素,该元素直接位于非数字元素后面的两个元素。

    # load necessary package
    library(tidyverse) --------
    
    # load necessary data ------
    sample_text <-
      c("811411 Home and Garden Equipment Repair and"   
        , "7699 Repair Services, Nec"
        , "Maintenance" # non-digit pattern
        , "811412 Appliance Repair and Maintenance"       
        , "7623 Refrigeration Service and Repair"         
        , "811412 Appliance Repair and Maintenance"       
        , "7629 Electrical Repair Shops")
    
    # previous solution -------
    sample_text %>%
      # for those elements which satisfy the non-digit pattern
      # identify the index of those elements which are exactly two behind
      replace(list = str_detect(., "^\\D*$") %>% which() - 2
              # of those elements which are exactly two behind the non-digit pattern
              # paste the non-digit pattern to the end of them.
              , values = paste(.[str_detect(., "^\\D*$") %>% which() - 2]
                               , str_subset(., "^\\D*$"))) %>%
      # only keep elements with digits
      str_subset("\\d")
    
    # [1] "811411 Home and Garden Equipment Repair and Maintenance" # successfully copied the non-digit element and pasted it two elements behind
    # [2] "7699 Repair Services, Nec"                             
    # [3] "811412 Appliance Repair and Maintenance"                
    # [4] "7623 Refrigeration Service and Repair"                  
    # [5] "811412 Appliance Repair and Maintenance"                
    # [6] "7629 Electrical Repair Shops" 
    
    # end of script #
    

    现在我意识到

    # sample data -----
    sample_text <-
      c("811310 Commercial and Industrial Machinery and"
        , "7692 Welding Repair"                           
        , "Equipment (except Automotive and" # non-digit pattern (1/2)           
        , "Electronic) Repair and Maintenance" # non-digit pattern (2/2)         
        , "811310 Commercial and Industrial Machinery and"
        , "7694 Armature Rewinding Shops"                 
        , "Equipment (except Automotive and" # non-digit pattern (1/2)           
        , "Electronic) Repair and Maintenance" # non-digit pattern (2/2)    
        , "811310 Commercial and Industrial Machinery and"
        , "7699 Repair Services, Nec"                     
        , "Equipment (except Automotive and" # non-digit pattern (1/2)         
        , "Electronic) Repair and Maintenance" # non-digit pattern (2/2)        
        , "811411 Home and Garden Equipment Repair and"   
        , "7699 Repair Services, Nec"                     
        , "Maintenance" # non-digit pattern (1/1)                               
        , "811412 Appliance Repair and Maintenance"       
        , "7623 Refrigeration Service and Repair"         
        , "811412 Appliance Repair and Maintenance"       
        , "7629 Electrical Repair Shops"                  
        , "811412 Appliance Repair and Maintenance"       
        , "7699 Repair Services, Nec")
    
    # desired output ------
     [1] "811310 Commercial and Industrial Machinery and Equipment (except Automotive and Electronic) Repair and Maintenance"
     [2] "7692 Welding Repair"           
     [3] "811310 Commercial and Industrial Machinery and Equipment (except Automotive and Electronic) Repair and Maintenance"
     [4] "7694 Armature Rewinding Shops"           
     [5] "811310 Commercial and Industrial Machinery and Equipment (except Automotive and Electronic) Repair and Maintenance"
     [6] "7699 Repair Services, Nec"           
     [7] "811411 Home and Garden Equipment Repair and Maintenance"   
     [8] "7699 Repair Services, Nec"                       
     [9] "811412 Appliance Repair and Maintenance"       
    [10] "7623 Refrigeration Service and Repair"         
    [11] "811412 Appliance Repair and Maintenance"       
    [12] "7629 Electrical Repair Shops"                  
    [13] "811412 Appliance Repair and Maintenance"       
    [14] "7699 Repair Services, Nec"
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   wp78de    6 年前

    根据预期的输出进行猜测,迭代向量,如果一行不包含任何数字,则应将其添加到元素之前,即当前 index - 1:

    x <- c()
    for(i in sample_text){
      if(grepl("^\\D*$",i, perl=TRUE)) {
        x[length(x)-1] <- paste(x[length(x)-1], i)
      } else {
        x <- c(x, i) #append
      }
    }
    

    输出:

     [1] "811310 Commercial and Industrial Machinery and Equipment (except Automotive and Electronic) Repair and Maintenance"
     [2] "7692 Welding Repair"                                                                                               
     [3] "811310 Commercial and Industrial Machinery and Equipment (except Automotive and Electronic) Repair and Maintenance"
     [4] "7694 Armature Rewinding Shops"                                                                                     
     [5] "811310 Commercial and Industrial Machinery and Equipment (except Automotive and Electronic) Repair and Maintenance"
     [6] "7699 Repair Services, Nec"                                                                                         
     [7] "811411 Home and Garden Equipment Repair and Maintenance"                                                           
     [8] "7699 Repair Services, Nec"                                                                                         
     [9] "811412 Appliance Repair and Maintenance"                                                                           
    [10] "7623 Refrigeration Service and Repair"                                                                             
    [11] "811412 Appliance Repair and Maintenance"                                                                           
    [12] "7629 Electrical Repair Shops"                                                                                      
    [13] "811412 Appliance Repair and Maintenance"                                                                           
    [14] "7699 Repair Services, Nec"        
    

    Online sample