【问题标题】:Replace one element in vector with multiple elements用多个元素替换向量中的一个元素
【发布时间】:2018-07-23 21:41:30
【问题描述】:

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

例如我有

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

【问题讨论】:

标签: r replace gsub


【解决方案1】:

我会这样处理它:

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

【讨论】:

  • 这里使用 lapply 可能比矢量化比较和列表拼接慢很多,就像 efbbrown 的回答尝试中所做的那样。
  • @KonradRudolph,这可能是真的。我没有说任何关于性能的事情(OP 也没有),但我很肯定这种方法在完成时会返回正确的答案。
【解决方案2】:

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

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

逻辑:用空格替换“x”为“b c”,然后进行strsplit,一旦拆分,我们可以再次使用unlist转换回向量。

【讨论】:

    【解决方案3】:

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

    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"s,这也将起作用,例如:

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

    【讨论】:

    • 很好奇为什么这被否决了。如果有人想详细说明为什么会出错,请告诉我
    【解决方案4】:

    另一种方法:

    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"
    

    【讨论】:

    • 我相信这也只有在你有 1 个"x" 时才有效。如果有 > 1 它只会替换第一个。
    • 我同意你们两个,相应地更改了函数名称。
    • @docendodiscimus 也修复了这个问题
    • 是的,您对错误是正确的,已修复。这个问题并没有要求一个可以替换多个 x 值的函数,只是一个可以用多个值替换一个元素的函数。
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2021-09-26
    • 2016-08-16
    相关资源
    最近更新 更多