【发布时间】:2018-05-03 11:47:40
【问题描述】:
我有一个角色"abc",想删除"b"。我想按位置定位。我试过了:
x <- "abc"
substr(x, 2,3) <- ""
x
#[1] "abc"
为什么不能像这样从字符串中删除一个字符?我将如何以同样简单的方法做到这一点?
【问题讨论】:
我有一个角色"abc",想删除"b"。我想按位置定位。我试过了:
x <- "abc"
substr(x, 2,3) <- ""
x
#[1] "abc"
为什么不能像这样从字符串中删除一个字符?我将如何以同样简单的方法做到这一点?
【问题讨论】:
简单地说,你可以在这里使用sub/gsub:
gsub("b", "", x)
但这会删除所有b 字母,无论它们出现在哪里。如果你想定位 b 夹在 a 和 c 之间,你可以变得聪明并使用环视:
gsub("(?<=a)b(?=c)", "", x, perl=TRUE)
编辑:
正如@DavidKlotz 在下面的评论中指出的那样,如果你真的想删除第二个字符,你可以使用:
gsub("(?<=^.).","", x, perl=TRUE)
【讨论】:
gsub("(?<=^.{1})(.)","", x, perl=TRUE)
I want to target by position.
gsub(paste0("(?<=^.{",n-1,"})."),"", x, perl=TRUE) 概括一下。
似乎不支持空字符串。
我认为破解它的最简单方法是使用一个不可能在您的数据中的字符,然后 gsub 将其删除:
x <- "abc"
substr(x, 2,3) <- "\a"
x <- gsub("\a","",x)
x
# [1] "ac"
您当然可以按照其他建议直接使用gsub,但我认为用索引替换是一个重要功能。
\a 是一个铃铛字符,来自维基百科:
铃声代码(有时是铃声字符)是设备控制代码 最初被派去敲响股票行情上的一个小型机电铃 其他电传打字机和电传打字机提醒对方的操作员 行尾,通常是传入消息的结尾
所以你可能是安全的!
【讨论】:
你说你“想按位置定位”,如果你的意思是你想从你的字符串中提取第二个字符而不考虑它的值,那么你可以简单地做:
x <- paste0(substr(x, 1, 1), substr(x, 3, nchar(x)))
# "ac" if x <- "abc" initially and "acd" if x <- "abcd" initially
您可以用substr() 替换一个字符,但不能删除它(因为您需要移动所有后续字符的位置等)。为此,您可以像这样组合substr 和gsub(例如,如果您确定您的字符串不包含破折号):
substr(x, 2, 3) <- '-'
gsub('-', '', x)
如果您想要删除"b" 出现,那么gsub() 如上面的答案中所述是一个不错的选择。
【讨论】:
您始终可以使用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"
【讨论】:
paste0(substr(x, 1, 1), substr(x, 3, nchar(x))) 可能是一个更好的选择(参见下面我的回答),并且在性能方面更快。需要的是删除单个字符,所以我认为将字符串拆分为字符有点矫枉过正,你不觉得吗?
-2 仅表示“获取除索引为 2 的元素之外的所有元素”,而 [[1]] 是因为 strsplit() 返回一个列表,其中第一个元素被拆分字符串,所以是选择分割后的字符串。
substr”...
你应该使用 gsub() 函数:
gsub(pattern = "b",replacement = "",x = x)
【讨论】: