从R

时间:2017-11-06 17:05:20

标签: r string

我有一个看起来像

的矢量
> inecodes
   [1] "01001" "01002" "01049" "01003" "01006" "01037" "01008" "01004" "01009" "01010" "01011"
  [12] "01013" "01014" "01016" "01017" "01021" "01022" "01023" "01046" "01056" "01901" "01027"
  [23] "01019" "01020" "01028" "01030" "01031" "01032" "01902" "01033" "01036" "01058" "01034"
  [34] "01039" "01041" "01042" "01043" "01044" "01047" "01051" "01052" "01053" "01054" "01055"

我想从这个载体中删除这些“数字”:

>pob
 [1] "01001-Alegría-Dulantzi"           "01002-Amurrio"                   
 [3] "01049-Añana"                      "01003-Aramaio"                   
 [5] "01006-Armiñón"                    "01037-Arraia-Maeztu"             
 [7] "01008-Arratzua-Ubarrundia"        "01004-Artziniega"                
 [9] "01009-Asparrena"                  "01010-Ayala/Aiara"               
[11] "01011-Baños de Ebro/Mañueta"      "01013-Barrundia"                 
[13] "01014-Berantevilla"               "01016-Bernedo"                   
[15] "01017-Campezo/Kanpezu"            "01021-Elburgo/Burgelu"           
[17] "01022-Elciego"                    "01023-Elvillar/Bilar"            
[19] "01046-Erriberagoitia/Ribera Alta"

它们比这些样品长,并且它们的长度不同。答案必须如下:

>pob
     [1] "Alegría-Dulantzi"           "Amurrio"                   
     [3] "Añana"                      "Aramaio"                   
     [5] "Armiñón"                    "Arraia-Maeztu"             
     [7] "Arratzua-Ubarrundia"        "Artziniega"                
     [9] "Asparrena"                  "Ayala/Aiara"               
    [11] "Baños de Ebro/Mañueta"      "Barrundia"                 
    [13] "Berantevilla"               "Bernedo"                   
    [15] "Campezo/Kanpezu"            "Elburgo/Burgelu"           
    [17] "Elciego"                    "Elvillar/Bilar"            
    [19] "Erriberagoitia/Ribera Alta"

4 个答案:

答案 0 :(得分:5)

不确定为什么你需要inecodes,因为你可以使用sub删除所有数字:

sub('^\\d+-', '', pob)

<强>结果:

 [1] "Alegría-Dulantzi"           "Amurrio"                    "Añana"                     
 [4] "Aramaio"                    "Armiñón"                    "Arraia-Maeztu"             
 [7] "Arratzua-Ubarrundia"        "Artziniega"                 "Asparrena"                 
[10] "Ayala/Aiara"                "Baños de Ebro/Mañueta"      "Barrundia"                 
[13] "Berantevilla"               "Bernedo"                    "Campezo/Kanpezu"           
[16] "Elburgo/Burgelu"            "Elciego"                    "Elvillar/Bilar"            
[19] "Erriberagoitia/Ribera Alta"

您可能需要inecodes的一个原因是您pob中的代码不在inecodes中,但看起来并非如此这里。如果您坚持使用inecodes删除pob中的号码,则可以使用str_replace_all中的stringr

library(stringr)

str_replace_all(pob, setNames(rep("", length(inecodes)), paste0(inecodes, "-")))

这给你完全相同的结果:

 [1] "Alegría-Dulantzi"           "Amurrio"                    "Añana"                     
 [4] "Aramaio"                    "Armiñón"                    "Arraia-Maeztu"             
 [7] "Arratzua-Ubarrundia"        "Artziniega"                 "Asparrena"                 
[10] "Ayala/Aiara"                "Baños de Ebro/Mañueta"      "Barrundia"                 
[13] "Berantevilla"               "Bernedo"                    "Campezo/Kanpezu"           
[16] "Elburgo/Burgelu"            "Elciego"                    "Elvillar/Bilar"            
[19] "Erriberagoitia/Ribera Alta"

数据:

inecodes = c("01001", "01002", "01049", "01003", "01006", "01037", "01008", 
"01004", "01009", "01010", "01011", "01013", "01014", "01016", 
"01017", "01021", "01022", "01023", "01046", "01056", "01901", 
"01027", "01019", "01020", "01028", "01030", "01031", "01032", 
"01902", "01033", "01036", "01058", "01034", "01039", "01041", 
"01042", "01043", "01044", "01047", "01051", "01052", "01053", 
"01054", "01055")

pob = c("01001-Alegría-Dulantzi", "01002-Amurrio", "01049-Añana", "01003-Aramaio", 
"01006-Armiñón", "01037-Arraia-Maeztu", "01008-Arratzua-Ubarrundia", 
"01004-Artziniega", "01009-Asparrena", "01010-Ayala/Aiara", "01011-Baños de Ebro/Mañueta", 
"01013-Barrundia", "01014-Berantevilla", "01016-Bernedo", "01017-Campezo/Kanpezu", 
"01021-Elburgo/Burgelu", "01022-Elciego", "01023-Elvillar/Bilar", 
"01046-Erriberagoitia/Ribera Alta")

答案 1 :(得分:1)

library(stringr)

for(code in inecodes) {
  ix <- which(str_detect(pob, code))
  pob[ix] <- unlist(str_split(pob, "-", 2))[2]
}

答案 2 :(得分:0)

试试这个。匹配应该快得多

pos<-which(!is.na(pob[match(sub('^([0-9]+)-.*$','\\1',pob),inecodes)]))
pob[pos]<-sub('^[0-9]+-(.*)$','\\1',pob[pos])

如果你设法得到这个,请发布时间。匹配通常解决了大数据集查找的许多计算问题。想看看是否有任何相反的情况。

答案 3 :(得分:0)

substr_detectstr_replace短一点的是str_remove

library(stringr)

c("01001-Alegría-Dulantzi", "01002-Amurrio") %>%
  str_remove("[0-9]*-")

返回

"Alegría-Dulantzi" "Amurrio"