我试图用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
循环的解决方案有任何想法,或者甚至是针对整个问题的更简单/更优雅的解决方案,我将不胜感激。谢谢。
答案 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)
或使用gl
,ave
和all
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