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

时间:2018-02-13 13:40:47

标签: r replace gsub

我有一个向量,我想用多个元素替换一个元素,我可以用一个而不是多个元素替换,任何人都可以帮忙吗?

例如我有

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

我想将"x"替换为"b", "c"以获取

[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

4 个答案:

答案 0 :(得分:4)

以下是我将如何处理它:

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的list-element,然后将结果取消列表以返回原子向量。

由于您要替换“x”的完全匹配,我不想在这种情况下使用sub / gsub

答案 1 :(得分:2)

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

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

逻辑:替换&#34; x&#34;用&#34; b c&#34;有空间然后做strsplit,一旦它分裂我们可以转换为使用unlist再次回到矢量。

答案 2 :(得分:1)

这对于一个问题来说有点棘手,因为在你的替换中你也想要增长你的向量。话虽如此,我相信这应该有用:

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")

答案 3 :(得分:0)

另一种方法:

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"