r - 替换向量中的元素组

时间:2014-09-25 09:29:31

标签: r vector replace elements

我试图用NAs替换向量总和为零的向量中的所有元素组。 每组的大小为3.例如:

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计算向量中组的起始索引。 可能有一种更优雅的方式,但这是我到目前为止缝合在一起的方式。 现在我被困在&#34;扩展&#34;起始索引的向量,用于生成要替换的元素序列。例如,如果向量b现在包含c(1,10,16),我将需要一个序列c(1,2,3,10,11,12,16,17,18),它们是由NA替换的元素的索引。 如果您对没有for循环的解决方案有任何想法,或者甚至是针对整个问题的更简单/更优雅的解决方案,我将不胜感激。谢谢。

马吕斯

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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

答案 2 :(得分: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