【问题标题】:Paste Together Consecutive Non-Digit Elements将连续的非数字元素粘贴在一起
【发布时间】:2019-02-20 18:50:47
【问题描述】:

问题

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

概述

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_text 包含连续的非数字元素,我不确定如何更新我以前的解决方案。任何帮助将不胜感激!

# 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"

【问题讨论】:

    标签: regex r regex text replace stringr


    【解决方案1】:

    根据您的预期输出猜测,您遍历向量,如果一行不包含任何数字,则应将其添加到之前的元素中,即当前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

    【讨论】:

    • 谢谢!这正是我想要的,@ wp78de。感谢您帮助我改进我的问题并解决我的问题。
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2019-12-08
    • 2019-11-07
    • 1970-01-01
    • 2021-06-16
    • 2015-11-27
    相关资源
    最近更新 更多