【问题标题】:Remove string from a vector in R从R中的向量中删除字符串
【发布时间】:2017-11-06 17:05:19
【问题描述】:

我有一个看起来像的向量

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

【问题讨论】:

  • 是的,但是如果你不理解这个问题,你不能给它负面评价,所以过去到下一个,不要试图只回答简单的问题。
  • 仅供参考,有人可能会否决您的问题,因为您提供的向量不容易复制(只需尝试复制并粘贴您在控制台中发布的内容并运行,它不会给您向量你会想要)。相反,请发布您用于创建这些向量的 代码
  • 问题很清楚,但“高级”用户永远不会明白,因为您只想问简单的问题。
  • 我的回答能解决你的问题吗?

标签: r string


【解决方案1】:

完全不知道为什么需要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 中不存在的代码,但这里的情况似乎并非如此。如果你坚持使用inecodespob中删除数字,你可以使用str_replace_all from 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")

【讨论】:

  • 有人否决了这个答案...请发表评论,以便我改进我的答案。
【解决方案2】:
library(stringr)

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

【讨论】:

  • 这段代码有很多计算代码,对不起
  • 您需要更优化的解决方案吗?
【解决方案3】:

试试这个。匹配应该更快

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

如果你设法得到这个,请发布时间。 Match 通常可以解决大型数据集查找的许多计算问题。想看看有没有相反的场景。

【讨论】:

    【解决方案4】:

    substr_detectstr_replace短一点的是str_remove

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

    返回

    "Alegría-Dulantzi" "Amurrio" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多