8

次のような 2 つのベクトルがあります。

A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)

結果のベクトルが

1,2,3,4,NA,NA,-1

あれは

  1. 位置 i のいずれかのベクトルに 1 つの値 (X など) しか存在しない場合 (もう一方は NA)、新しいベクトルは位置 i の値 X を取る必要があります。

  2. 両方の値が位置 i で NA の場合、新しいベクトルは位置 i で値 NA を取る必要があります。

  3. 両方のベクトルの位置 i に値がある場合、新しいベクトルは位置 i で値 -1 を取る必要があります。

これはループで簡単に実行できますが、大規模なデータセットでは非常に遅いため、これを行うための高速な方法を誰かが提供できますか?

4

3 に答える 3

11

これらのコマンドは、ベクトルを作成します。

X <- A
X[is.na(A)] <- B[is.na(A)]
X[is.na(B)] <- A[is.na(B)]
X[!is.na(A & B)] <- -1

#[1]  1  2  3  4 NA NA -1
于 2012-09-20T11:24:54.177 に答える
5
A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)
C <- rowMeans(cbind(A,B),na.rm=TRUE)
C[which(!is.na(A*B))]<- -1
#[1]   1   2   3   4 NaN NaN  -1

ベンチマーク:

Unit: microseconds
          expr    min     lq median     uq     max
1 Roland(A, B) 17.863 19.095 19.710 20.019  68.985
2   Sven(A, B) 11.703 13.243 14.167 14.783 100.398
于 2012-09-20T11:25:12.843 に答える
2

パーティーには少し遅れましたが、cbind一緒に ed された 2 つのベクトルにルールを適用することによって機能する関数を定義する別のオプションを次に示します。

# get the data
A <- c(1,2,NA,NA,NA,NA,7)
B <- c(NA,NA,3,4,NA,NA,7)

# define the function
process <- function(A,B) {
  x <- cbind(A,B)
  apply(x,1,function(x) {
    if(sum(is.na(x))==1) {na.omit(x)} else
    if(all(is.na(x))) {NA} else
    if(!any(is.na(x))) {-1}
  })
}

# call the function
process(A,B)
#[1]  1  2  3  4 NA NA -1

関数を使用する主な利点は、ルールまたは入力を更新してコードを新しいデータに適用するのが簡単になることです。

于 2012-09-20T12:11:30.340 に答える