用多个元素替换向量中的一个元素

Replace one element in vector with multiple elements

我有一个向量,我想用多个元素替换一个元素,我可以用一个元素替换,但不能用多个元素替换,有人能帮忙吗?

比如我有

data <- c('a', 'x', 'd')
> data
[1] "a" "x" "d"

我想用 "b", "c" 替换 "x" 以获得

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

但是

gsub('x', c('b', 'c'), data)

给我

[1] "a" "b" "d"
Warning message:
In gsub("x", c("b", "c"), data) :
  argument 'replacement' has length > 1 and only the first element will 
be used

另一种方法:

data <- c('a', 'x', 'd')
pattern <- "x"
replacement <- c("b", "c")

sub_one_for_many <- function(pattern, replacement, x) {
  removal_index <- which(x == pattern)
  if (removal_index > 1) {
    result <- c(x[1:(removal_index-1)], replacement, x[(removal_index+1):length(x)])
  } else if (removal_index == 1) {
    result <- c(replacement, x[2:length(x)])
  }
  return(result)
}

answer <- sub_one_for_many(pattern, replacement, data)

输出:

> answer
[1] "a" "b" "c" "d"

这是一个有点棘手的问题,因为在你的替换中你还想增加你的向量。话虽如此,我相信这应该有效:

replacement <- c("b","c")

new_data <- rep(data, times = ifelse(data=="x", length(replacement), 1))
new_data[new_data=="x"] <- replacement

new_data
#[1] "a" "b" "c" "d"

如果您的向量中有多个 "x",这也适用,例如:

data <- c("a","x","d","x")

以下是我的处理方法:

data <- c('a', 'x', 'd')
lst <- as.list(data)
unlist(lapply(lst, function(x) if(x == "x") c("b", "c") else x))
# [1] "a" "b" "c" "d"

我们正在利用列表结构比原子向量更灵活的事实。我们可以用长度>1 的元素替换长度为 1 的列表元素,然后取消列出结果以返回原子向量。

因为你想替换 "x" 的完全匹配,所以我不想在这种情况下使用 sub/gsub

你可以试试这个,虽然我相信接受的答案很好:

unlist(strsplit(gsub("x", "b c", data), split = " "))

逻辑:将"x"替换为"b c"和space,然后进行strsplit,一旦拆分我们就可以再次转换回来使用 unlist 向量。