又是我
我在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"
我不明白为什么会这样,对我来说,这似乎与文档不符。有人可以向我解释原因或解决方法吗?
答案 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"