sub()函数替换所有匹配项

时间:2019-10-03 10:51:33

标签: r grep match

又是我

我在R中的sub()函数有问题: 该文档说:“ sub和gsub分别替换第一个和所有匹配项。”

我有一个代码,我只想用另一个替换一个项目(条件是说,如果出现一个项目,我希望它在向量中是两次-但这不是必需的信息)。

但是,如果我执行该子功能,它将替换所有内容。这里有一些代码来演示正在发生的事情:

a = c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
> sub("a", "f", a)
[1] "f" "b" "c" "d" "f" "b" "c" "d" "f" "f"
> gsub("a", "f", a)
[1] "f" "b" "c" "d" "f" "b" "c" "d" "f" "f"

如您所见,在我的情况下,sub和gsub执行相同的操作,但是我希望结果如下:

a = c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
> sub("a", "f", a)
[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"

我不明白为什么会这样,对我来说,这似乎与文档不符。有人可以向我解释原因或解决方法吗?

5 个答案:

答案 0 :(得分:3)

您可以使用match查找第一个匹配项,然后使用返回的索引替换字符串。

a[match("a", a)]  <- "f"
a
# [1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"

答案 1 :(得分:2)

sub中的正则表达式对每个向量的处理方式不同。也许以下示例可以帮助您了解它们之间的区别。

a = c("aaaa", "b", "c", "d", "a", "b", "c", "d", "a", "a")
sub("a", "f", a)
#[1] "faaa" "b"    "c"    "d"    "f"    "b"    "c"    "d"    "f"    "f" 

gsub("a", "f", a)
#[1] "ffff" "b"    "c"    "d"    "f"    "b"    "c"    "d"    "f"    "f" 

因此,对于sub,只有第一个"a"变为"f",而对于gsub,所有"a"都变为"f"。同样,这看起来像是完全匹配而不是部分匹配,因此在这里无需使用正则表达式。

您可以将a"a"进行比较,并用"f"替换第一个匹配项。

a = c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
a[which.max(a == "a")] <- "f"
a
#[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"

答案 2 :(得分:1)

假设每个元素只有一个字符,并且如果您有能力合并和分割向量,则可以这样做

> unlist(strsplit(sub("a","f",paste0(a,collapse="")),""))
 [1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"

答案 3 :(得分:0)

您可以在此处使用grepl来查找输入向量中包含"a"的所有索引。然后,仅替换第一个匹配索引。

a <- c("a", "b", "c", "d", "a", "b", "c", "d", "a", "a")
a[min(which(grepl("a", a) == TRUE))] <- "f"
a

[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"

请注意,sub()实际上将是模式中的第一个匹配项,但是对于每个输入 sub()函数是向量化的,当您将向量传递给它时,它会代替向量中的 each 值中的第一个匹配项,而不是单个值,而不是单个值元素。

答案 4 :(得分:0)

@ user2974951在其评论中指出,sub(pat, repl, x)是矢量化的,这意味着它将在{em>的每个元素中将pat的第一个实例替换为repl x

如果必须使用sub,则可以连接条目,将pat替换为repl,然后在每个字符上再次分割字符串。

unlist(strsplit(sub("a", "f", paste0(a, collapse = "")), ""))
#[1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"