R 函数的作用是替换所有匹配项

R 函数的作用是替换所有匹配项,r,match,R,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

又是我

我对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"

我不明白为什么会发生这种情况,对我来说,这似乎与文档不符。有人能给我解释一下原因或解决方法吗?

您可以在这里使用
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"

a假设每个元素只有一个字符,如果您可以合并和拆分向量,您可以这样做

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

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

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

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

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”)]您可以使用
match
查找第一次命中,并使用返回的索引替换字符串

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

a[match(“a”,a)]只在一个字符串中起作用,您有一个字符串向量,因此每个元素都被单独处理。这确实是一个非常有用的解释,解释了为什么会发生这种情况!非常感谢你!
a[match("a", a)]  <- "f"
a
# [1] "f" "b" "c" "d" "a" "b" "c" "d" "a" "a"