21

私はRにベクトルを持っています、

a = c(2,3,4,9,10,2,4,19)

次のベクトル b と c を効率的に挿入したいとしましょう。

b = c(2,1)
d = c(0,1)

3 番目と 7 番目の位置 (「4」エントリ) の直後に、

e = c(2,3,4,2,1,9,10,2,4,0,1,19)

再帰的に使用することなく、Rでこれを効率的に行うにはどうすればよいでしょうcbindか。

パッケージR.basicを見つけましたが、CRAN パッケージの一部ではないため、サポートされているバージョンを使用することを考えました。

4

6 に答える 6

16

これを試して:

result <- vector("list",5)
result[c(TRUE,FALSE)] <- split(a, cumsum(seq_along(a) %in% (c(3,7)+1)))
result[c(FALSE,TRUE)] <- list(b,d)
f <- unlist(result)

identical(f, e)
#[1] TRUE

EDIT:任意の数の挿入への一般化は簡単です:

insert.at <- function(a, pos, ...){
    dots <- list(...)
    stopifnot(length(dots)==length(pos))
    result <- vector("list",2*length(pos)+1)
    result[c(TRUE,FALSE)] <- split(a, cumsum(seq_along(a) %in% (pos+1)))
    result[c(FALSE,TRUE)] <- dots
    unlist(result)
}


> insert.at(a, c(3,7), b, d)
 [1]  2  3  4  2  1  9 10  2  4  0  1 19

> insert.at(1:10, c(4,7,9), 11, 12, 13)
 [1]  1  2  3  4 11  5  6  7 12  8  9 13 10

> insert.at(1:10, c(4,7,9), 11, 12)
Error: length(dots) == length(pos) is not TRUE

位置と挿入の数が一致しない場合のボーナス エラー チェックに注意してください。

于 2013-09-23T03:18:46.383 に答える
12

次の機能を使用できます。

ins(a, list(b, d), pos=c(3, 7))
# [1]  2  3  4  2  1  9 10  2  4  0  1  4 19

どこ:

ins <- function(a, to.insert=list(), pos=c()) {

  c(a[seq(pos[1])], 
    to.insert[[1]], 
    a[seq(pos[1]+1, pos[2])], 
    to.insert[[2]], 
    a[seq(pos[2], length(a))]
    )
}
于 2013-09-23T03:35:24.007 に答える
5

簡単なアプローチ:

b.pos <- 3
d.pos <- 7
c(a[1:b.pos],b,a[(b.pos+1):d.pos],d,a[(d.pos+1):length(a)])
[1]  2  3  4  2  1  9 10  2  4  0  1 19

:演算子の境界に対する括弧の重要性に注意してください。

于 2013-09-23T06:22:01.093 に答える
2

を使用する代替手段を次に示しますappend。小さなベクトルでは問題ありませんが、ループの反復ごとに新しいベクトルが作成されるため、大きなベクトルでは効率的であるとは想像できません (これは明らかに悪いことです)。秘訣は、挿入する必要があるもののベクトルを逆にappendして、元のベクトルに対して正しい場所に挿入することです。

a = c(2,3,4,9,10,2,4,19)
b = c(2,1)
d = c(0,1)

pos <- c(3, 7)
z <- setNames(list(b, d), pos)
z <- z[order(names(z), decreasing=TRUE)]


for (i in seq_along(z)) {
  a <- append(a, z[[i]], after = as.numeric(names(z)[[i]]))
}

a
#  [1]  2  3  4  2  1  9 10  2  4  0  1 19
于 2013-09-23T14:49:12.530 に答える