【问题标题】:How to truncate specific part of string if present如果存在,如何截断字符串的特定部分
【发布时间】:2021-03-25 17:05:54
【问题描述】:

让我们考虑以下向量:

x <- c("GDP_UK", "GDP_US", "GDP_UK_diff2_L2", 
       "INC","GDP_UK_L2", "GDP_US_level", "INC_UK", "INC_L1", "INC_diff1")

如您所见,有一个包含一些字符串的向量。

我要做的是找到其中有"_diff(number)", "_L(number), _level的人,并截断这部分字符串。

我想最终得到一个向量:

c("GDP_UK", "GDP_US", "GDP_UK", "INC", "GDUP_UK", "GDP_US", "INC_UK", "INC", "INC")

如您所见,所有_diff, _L, _level 都被截断以获得原始字符串。

我不知道该怎么做。我试过代码

x[grepl(paste(c("diff", "level", "_L"), collapse = "|"), x)]

只获取包含grepllevel_L 的元素,但我不知道如何剪切它。用substring 尝试了一些东西,但不确定如何指定应该删除哪个字母。你知道怎么做吗?

** 编辑 **

我们可以使用以下代码:

x <- gsub(pattern = "_L", replacement = "", x)
x <- gsub(pattern = "_diff", replacement = "", x)
x <- gsub(pattern = "_level", replacement = "", x)

但是,我们将在字符串末尾得到剩余的数字:

 "GDP_UK"   "GDP_US"   "GDP_UK22" "INC"      "GDP_UK2"  "GDP_US"   "INC_UK"   "INC2"     "INC1"  

【问题讨论】:

    标签: r string character


    【解决方案1】:

    您要查找的是正则表达式"_L\\d*" 等。它匹配下划线、L 和零个或多个数字。

    完整

    
    x <- c("GDP_UK", "GDP_US", "GDP_UK_diff2_L2", 
           "INC","GDP_UK_L2", "GDP_US_level", "INC_UK", "INC_L1", "INC_diff1")
    
    gsub("_L\\d*", "", x)
    gsub("_diff\\d*", "", x)
    gsub("_level\\d*", "", x)
    
    
    # or in one go:
    library(stringr)
    x %>% 
      str_replace_all("_L\\d*", "") %>% 
      str_replace_all("_diff\\d*", "") %>% 
      str_replace_all("_level\\d*", "")
    #> [1] "GDP_UK" "GDP_US" "GDP_UK" "INC"    "GDP_UK" "GDP_US" "INC_UK" "INC"   
    #> [9] "INC"
    
    ## or even in one go:
    gsub("_(L|diff|level)\\d*", "", x)
    #> [1] "GDP_UK" "GDP_US" "GDP_UK" "INC"    "GDP_UK" "GDP_US" "INC_UK" "INC"   
    #> [9] "INC"
    

    【讨论】:

    • 最后的代码是我最喜欢的!非常感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2021-07-20
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多