矢量化插入元素
发布时间:2020-12-15 04:09:06 所属栏目:Java 来源:网络整理
导读:我编写了一个R函数插入,用于在向量v的给定位置p处插入给定元素e. 这里是: insert - function(v,e,p) { if (length(e) != 1 || length(p) != 1) { stop('supported the insertion of only one element per call.') } len - length(v) nms - names(v) enm - n
我编写了一个R函数插入,用于在向量v的给定位置p处插入给定元素e.
这里是: insert <- function(v,e,p) { if (length(e) != 1 || length(p) != 1) { stop('supported the insertion of only one element per call.') } len <- length(v) nms <- names(v) enm <- names(e) res <- NULL if (p > 1 && p <= len) { res <- c(v[1:(p-1)],v[p:len]) # insert } else if (p == 1) { res <- c(e,v) # prepend } else if (p == (len+1)) { res <- c(v,e) # append } else { stop('wrong position') } if (!is.null(enm)) { names(res) <- insert(nms,enm,p) } res } 请注意,此函数与R中的几乎所有内容一样,返回一个新向量.另外(参见递归调用),它还插入元素的名称(如果有的话). 这是一个简单的使用示例: a <- c(1,2,3,4,5,7,8,10) names(a) <- c(letters[1:5],letters[7:8],letters[10]) a # a b c d e g h j # 1 2 3 4 5 7 8 10 b <- c(9) names(b) <- letters[9] insert(a,b,8) # a b c d e g h i j # 1 2 3 4 5 7 8 9 10 我正在尝试编写此函数的矢量化(高效)版本. 现在,我写了一个优雅的解决方案: vinsert <- function(v,elems,positions) { out <- v for (i in 1:length(elems)) { out <- insert(out,elems[i],positions[i]) } out } 这里有一个简单的使用示例: a <- c(1,letters[10]) a # a b c d e g h j # 1 2 3 4 5 7 8 10 z <- c(6,9) names(z) <- c(letters[6],letters[9]) z # f i # 6 9 vinsert(a,z,z) # a b c d e f g h i j # 1 2 3 4 5 6 7 8 9 10 所以,我正在考虑的两个函数(插入和vinsert)的问题是: >返回一个新的向量或修改向量并返回它? 任何建议,帮助或更优雅和有效的解决方案?提前致谢. 解决方法
似乎存在许多问题,例如,插入顺序如何受先前插入的影响,以及插入多于一个元素的序列时该怎么做.这里我们有一个原始序列
x <- letters[1:10] 以及我们想要插入的一些内容 v <- LETTERS[1:4] 我们想要插入它们的位置 at <- c(4,6) 进行插入的一种方法是计算新索引值相对于原始值的顺序;订单提供稳定的订单 o <- order(c(seq_along(x),at)) 然后进行插入 > c(x,v)[o] [1] "a" "b" "C" "c" "d" "A" "e" "f" "D" "g" "B" "h" "i" "j" 插入规则与原始插入规则不完全相同 > o = order(c(seq_along(a),z)) > c(a,z)[o] a b c d e g f h j i 1 2 3 4 5 7 6 8 10 9 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |