【问题标题】:Add a series of elements in different locations within a vector在向量内的不同位置添加一系列元素
【发布时间】:2016-03-20 03:23:22
【问题描述】:

我的目标是将多个元素插入到不同位置的向量中。这是一个例子,后面跟着一些不起作用的试验。

w  <- c( 1,3,2,4,2,3,2,4,5,7,9,3,2,4,2,5,7,4,2 )
u  <- c( 3,7,9,12 )
o  <- c( 10 , 20 , 30 , 40 )

我试过了:

append ( w , o , after = u )  

# which adds the series one time in the first location of after 

fun <- function (x) append ( w , o[[x]] , after = u[[x]] )
lapply ( seq ( length ( u )) , fun )

# which adds one element to the list each time for a new vector producing a  number of vectors 

for (i in length(o)) {
append ( w , o[[i]] , after = u[[i]] )
}
# which basically does nothing

期望的输出

1,3,2,10,4,2,3,2,20,4,5,30,7,9,3,40,2,4,2,5,7,4,2

有没有办法在每个特定位置一次插入一个元素?我已经看到几个问题解决了单个元素的附加基本问题,其中一个位置或两个元素要添加到同一位置,而不是多个元素要添加到向量中的多个位置。

【问题讨论】:

  • 刚刚被提示找到一个解决方案,因为我忘记在问题中为循环命名。但是,根据许多建议的解决方案,矢量化应该更快。

标签: r


【解决方案1】:

这是执行此操作的另一种矢量化方式

New <- rep(w, (1:2)[(1:length(w) %in% u) + 1])
New[u + 1:length(u)] <- o
New
# [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2

这基本上适用于子集向量技术,通过两次提取 u 中的值并使用来自 o 的值重新分配它们

【讨论】:

    【解决方案2】:
    x <- numeric(length(w)+length(o))
    ind <- u + order(u) #index to insert o vector (which I shamelessly borrowed from Josilber's answer)
    x[ind] <- o
    x[-ind] <- w
    x
    # [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2
    

    【讨论】:

      【解决方案3】:

      您可以通过计算每个新元素和旧元素的位置并一次性添加它们来以矢量化方式(也就是不重复 appending)来做到这一点:

      # Positions of old and new elements
      add.pos <- u + order(u)
      old.pos <- seq_len(length(w) + length(u))
      old.pos <- old.pos[!old.pos %in% add.pos]
      
      # Construct new vector in one shot
      new.vec <- rep(NA, length(old.pos))
      new.vec[add.pos] <- o
      new.vec[old.pos] <- w
      new.vec
      # [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2
      

      由于这不涉及每次添加元素时重复为向量重新分配空间,因此如果要添加大量元素,它应该会更快。

      【讨论】:

        【解决方案4】:
        idx <- sort(c(1:length(w), u))
        replace(w[idx], c(FALSE, diff(idx) == 0), o)
        # [1]  1  3  2 10  4  2  3  2 20  4  5 30  7  9  3 40  2  4  2  5  7  4  2
        

        【讨论】:

        • 除了代码你不喜欢写很多东西,不是吗
        • @DavidArenburg,取决于一个问题和我的回答
        • 从简单的问题中可以看出,我自己不是代码专家,因为答案是如何以比循环更有效的方式执行此操作。让我问你是否同意将问题转换为如何比循环更有效地运行上述问题。
        • @Barnaby,只要问题没有显着不同,编辑问题就不应该成为问题。在这种情况下应该没问题。
        猜你喜欢
        • 2020-10-04
        • 2015-04-15
        • 2020-10-18
        • 2020-12-29
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        相关资源
        最近更新 更多