R 函数的作用是替换所有匹配项
又是我 我对R中的sub()函数有问题: 文档中说:“sub和gsub分别替换第一个匹配项和所有匹配项。” 我有一个代码,我只想用另一个替换一个项目(有条件地说,如果一个项目出现,我希望它在一个向量中出现两次-但这不是这里的必要信息) 但是,如果我执行子函数,它将替换所有内容。下面是一些代码来演示正在发生的事情: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
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"