【问题标题】:Using substr() to delete a character使用 substr() 删除一个字符
【发布时间】:2018-05-03 11:47:40
【问题描述】:

我有一个角色"abc",想删除"b"。我想按位置定位。我试过了:

x <- "abc"
substr(x, 2,3) <- ""

x
#[1] "abc"

为什么不能像这样从字符串中删除一个字符?我将如何以同样简单的方法做到这一点?

【问题讨论】:

    标签: r string character substr


    【解决方案1】:

    简单地说,你可以在这里使用sub/gsub

    gsub("b", "", x)
    

    但这会删除所有b 字母,无论它们出现在哪里。如果你想定位 b 夹在 ac 之间,你可以变得聪明并使用环视:

    gsub("(?<=a)b(?=c)", "", x, perl=TRUE)
    

    编辑:

    正如@DavidKlotz 在下面的评论中指出的那样,如果你真的想删除第二个字符,你可以使用:

    gsub("(?<=^.).","", x, perl=TRUE)
    

    【讨论】:

    • 我认为 OP 想要删除位置 2 中的任何字符。根据您的建议,人们也可以这样做,记住正则表达式索引从 0 开始:gsub("(?&lt;=^.{1})(.)","", x, perl=TRUE)
    • @DavidKlotz 感谢您的建议,我在上面稍作修改。它有助于阅读整个问题:I want to target by position.
    • gsub(paste0("(?&lt;=^.{",n-1,"})."),"", x, perl=TRUE) 概括一下。
    【解决方案2】:

    似乎不支持空字符串。

    我认为破解它的最简单方法是使用一个不可能在您的数据中的字符,然后 gsub 将其删除:

    x <- "abc"
    substr(x, 2,3) <- "\a"
    x <- gsub("\a","",x)
    x
    # [1] "ac"
    

    您当然可以按照其他建议直接使用gsub,但我认为用索引替换是一个重要功能。

    \a 是一个铃铛字符,来自维基百科:

    铃声代码(有时是铃声字符)是设备控制代码 最初被派去敲响股票行情上的一个小型机电铃 其他电传打字机和电传打字机提醒对方的操作员 行尾,通常是传入消息的结尾

    所以你可能是安全的!

    【讨论】:

      【解决方案3】:

      你说你“想按位置定位”,如果你的意思是你想从你的字符串中提取第二个字符而不考虑它的值,那么你可以简单地做:

      x <- paste0(substr(x, 1, 1), substr(x, 3, nchar(x)))
      # "ac" if x <- "abc" initially and "acd" if x <- "abcd" initially
      

      您可以用substr() 替换一个字符,但不能删除它(因为您需要移动所有后续字符的位置等)。为此,您可以像这样组合substrgsub(例如,如果您确定您的字符串不包含破折号):

      substr(x, 2, 3) <- '-'
      gsub('-', '', x)
      

      如果您想要删除"b" 出现,那么gsub() 如上面的答案中所述是一个不错的选择。

      【讨论】:

      • 我认为这是最简单的解决方案,但是:如果我执行 x
      • 你是对的,我的错。但它可以替换一个字符而不是删除它。我更新了答案。
      【解决方案4】:

      您始终可以使用strsplit,这很有用如果您想按位置解决此问题(即在您的情况下删除第二个字母),

      paste(strsplit(x, '')[[1]][-2], collapse = '')
      #[1] "ac"
      

      要应用于多个字符串,我们需要在拆分后进行迭代,即

      x <- c('abc', 'sdfre', 'xyz')
      sapply(strsplit(x, ''), function(i)paste(i[-2], collapse = ''))
      #[1] "ac"   "sfre" "xz"  
      

      【讨论】:

      • 这就是我要找的东西,也许 R 开发人员称之为简单......那些索引是什么? -2 第二个字母?为什么[[1]]?为什么我的方法会失败?
      • 让我用多个字符串来演示。
      • 我认为paste0(substr(x, 1, 1), substr(x, 3, nchar(x))) 可能是一个更好的选择(参见下面我的回答),并且在性能方面更快。需要的是删除单个字符,所以我认为将字符串拆分为字符有点矫枉过正,你不觉得吗?
      • @Pascallv,-2 仅表示“获取除索引为 2 的元素之外的所有元素”,而 [[1]] 是因为 strsplit() 返回一个列表,其中第一个元素被拆分字符串,所以是选择分割后的字符串。
      • @Sotos,我的也使用位置 2(1 = 2-1 和 3 = 2+1),这与调用多少函数无关。但我同意两者都是可接受的解决方案:) 只是问题指定“使用substr”...
      【解决方案5】:

      你应该使用 gsub() 函数: gsub(pattern = "b",replacement = "",x = x)

      【讨论】:

      • 这和@Tim Biegeleisen 的回答一样
      猜你喜欢
      • 1970-01-01
      • 2017-10-11
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      相关资源
      最近更新 更多