2014-09-25 106 views
2

我試圖用NAs替換總和爲零的矢量中的所有元素組。 每個組的大小爲3。例如:r - 替換矢量中的元素組

a = c(0,0,0,0,2,3,1,0,2,0,0,0,0,1,2,0,0,0) 

應該是最後:

c(NA,NA,NA,0,2,3,1,0,2,NA,NA,NA,0,1,2,NA,NA,NA) 

到現在爲止,我已經成功地通過找到具有相等的總和組零:

b = which(tapply(a,rep(1:(length(a)/3),each=3),sum) == 0) 

其產生c(1,4,6)

我然後計算通過:b <- b*3-2開始向量中組的索引。 也許有一種更優雅的方式,但這是我迄今縫合在一起的東西。 現在我被困在「擴展」開始索引的向量中,以生成要被替換的元素序列。例如,如果向量b現在包含c(1,10,16),則需要一個序列c(1,2,3,10,11,12,16,17,18),這些元素是要由NAs替換的元素的索引。 如果您對沒有for循環的解決方案有任何想法,或者對於整個問題甚至是更簡單/優雅的解決方案,我都會很感激。謝謝。

馬呂斯

回答

2

您可以使用這樣的事情:

a[as.logical(ave(a, 0:(length(a)-1) %/% 3, 
      FUN = function(x) sum(x) == 0))] <- NA 
a 
# [1] NA NA NA 0 2 3 1 0 2 NA NA NA 0 1 2 NA NA NA 

0:(length(a)-1) %/% 3創建所需長度的羣體(在這種情況下,3)和ave用來檢查是否這些組添加到0或不。

+0

是。那就是訣竅。謝謝。 – Marius 2014-09-25 09:50:35

2

要指定相同組的值,請將您的矢量轉換爲(三行)矩陣。然後,您可以計算列方式的總和並與0比較。其餘部分很簡單。

a <- c(0,0,0,0,2,3,1,0,2,0,0,0,0,1,2,0,0,0) 
a <- as.integer(a) 
is.na(a) <- rep(colSums(matrix(a, 3L)) == 0L, each = 3L) 
a 
#[1] NA NA NA 0 2 3 1 0 2 NA NA NA 0 1 2 NA NA NA 

注意,我就與整數比較表明,如果你的載體不是整數,你需要考慮this FAQ

+1

@Marius我的答案也是一行一行(實際上它比Ananda的代碼短),可以使用'apply'使其更一般化。可能它也更快。 (這只是對你的評論的回覆,我不需要勾號。) – Roland 2014-09-25 10:45:24

0

或者使用glaveall

n <- length(a) 
a[ave(!a, gl(n, 3, n), FUN=all)] <- NA 
a 
#[1] NA NA NA 0 2 3 1 0 2 NA NA NA 0 1 2 NA NA NA