【问题标题】:How to insert elements into multiple positions in a vector without iteration如何在不迭代的情况下将元素插入向量中的多个位置
【发布时间】:2015-10-01 10:12:20
【问题描述】:

给定一个元素向量u和一个索引向量i到向量x,我们如何将u的元素插入到x中与i中的索引对应的元素之后,没有迭代?

例如

x <- c('a','b','c','d','e')
u <- c('X','X')
i <- c(2,3)
# now we want to get c('a','b','X','c','X','d','e')

我想一步完成(即避免循环),因为每一步都需要创建一个新向量,而实际上这些都是长向量。

我希望有一些索引魔法。

【问题讨论】:

  • 试试x[i] &lt;- u 哎呀...误解了输出

标签: r


【解决方案1】:

我认为只要 i 不包含重复索引,这应该可以工作。

idx <- sort(c(seq_along(x), i))
y <- x[idx]
y[duplicated(idx)] <- u
y
#[1] "a" "b" "X" "c" "X" "d" "e"

编辑 正如@MartinMorgan 在 cmets 中建议的那样,更好的方法是 c(x, u)[order(c(seq_along(x), i))].

【讨论】:

  • 或者沿着相同的路线c(x, u)[order(c(seq_along(x), i))] 可能处理重复和无序的i
  • @MartinMorgan 好一个,你的方法好多了。也许将其发布为应该被接受的答案
  • 如果没有你最初的想法,我不会想出我的改进,所以功劳归你@konvas。
【解决方案2】:

与此同时,我想出了一些可以完成这项工作的方法(前提是 i 中的索引是唯一的):

xn <- rep(NA,length(x))
xn[i] <- u
y <- c(rbind(x,xn))
y <- y[!is.na(y)] 

【讨论】:

    【解决方案3】:

    这是我的功能

    # vec->source vector, val->values to insert, at->positions to insert
    
    func_insert_vector_at <- function(vec, val, at){
        out=numeric(length(vec)+length(val))
        out[at]=NA
        out[!is.na(out)]=vec
        out[at]=val
        return(out)
    }
    

    【讨论】:

    • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
    • 我认为函数简洁明了。该函数完全符合问题的含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2021-07-24
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多