【问题标题】:r - replacing groups of elements in vectorr - 替换向量中的元素组
【发布时间】:2014-11-20 00:27:04
【问题描述】:

我正在尝试用 NA 替换向量中总和为零的所有元素组。 每组的大小为 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 计算向量中组的起始索引。 可能有一种更优雅的方式,但这是我迄今为止缝合的方式。 现在我被困在“扩展”起始索引的向量上,以生成要替换的元素序列。例如,如果向量b 现在包含c(1,10,16),我将需要一个序列c(1,2,3,10,11,12,16,17,18),它是要被NA 替换的元素的索引。 如果您对没有for 循环的解决方案有任何想法,或者对整个问题有更简单/优雅的解决方案,我将不胜感激。谢谢。

马吕斯

【问题讨论】:

    标签: r vector replace elements


    【解决方案1】:

    你可以这样使用:

    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。

    【讨论】:

      【解决方案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

      【讨论】:

      • @Marius 我的答案也是单行的(实际上它比 Ananda 的代码短),并且可以使用 apply 使其更通用。可能,它也更快。 (这只是对你的评论的回复。我不需要打勾。)
      【解决方案3】:

      或者使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 2012-01-16
        相关资源
        最近更新 更多