2012-09-20 55 views
6

我有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),新的向量應該取值爲X在posi我i。

  2. 在雙方的值NA在位置i,新的載體應取的值NA在位置i

  3. 當兩個矢量具有在位置的值I時,新矢量應取的值在-1職位i。

我可以很容易地做到這一點有一個循環,但由於大型數據集,以便任何人都可以提供快速的方法來做到這一點是很慢?

+0

迭代似乎是你唯一的希望。緩慢可能是因爲分支預測問題。 – AJMansfield

+0

你認爲大數據集是什麼? – Roland

回答

8

這些命令創建的載體:

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 
+0

這就是我要說的話......我得早點起牀! –

+1

如果你在開始創建一個帶有-1的向量的'X < - -A^0',你不需要最後一行,整個事情就更快了。 – Roland

+0

有趣的是,@Roland:結果'X <-A^0'比'X < - rep(-1,length(A))快' –

4
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 
+0

這真的很好。謝謝+1 –

+0

除NaN與NA不一樣外。你應該添加一條線來代替NaN NA –

+0

如果這很重要,很容易做到。不過,Sven的解決方案無論如何都更加高效。 – Roland

1

有點遲到了,但這裏是另一種選擇定義,通過應用規則來運作的功能兩個矢量cbind - 在一起。

# 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 

使用函數的主要好處是更新規則或輸入以將代碼應用於新數據更容易。