r检查行元素是否在边界内

时间:2013-12-14 17:06:31

标签: r boundary

我正在使用大量组合。我想要一种方法来消除它们中的一部分,这样就可以消除元素靠近在一起的所有组合(由我设置关闭)。 (注意,它可能需要一两秒,它相当大)。

我们举个例子:

library(gtools)

support<-matrix(seq(0,1,by=0.1), ncol=1)
support.n<-as.matrix(permutations(length(support), 3,support))

但是现在我想消除所有2个组合都“接近”的行(比如,相互之间的+/- 0.2,包括在内)。也就是说,我该如何转换:

...
[964,]  1.0  0.7  0.0
[965,]  1.0  0.7  0.1
[966,]  1.0  0.7  0.2
[967,]  1.0  0.7  0.3
[968,]  1.0  0.7  0.4
[969,]  1.0  0.7  0.5
[970,]  1.0  0.7  0.6
[971,]  1.0  0.7  0.8
[972,]  1.0  0.7  0.9
[973,]  1.0  0.8  0.0
[974,]  1.0  0.8  0.1
[975,]  1.0  0.8  0.2
[976,]  1.0  0.8  0.3
[977,]  1.0  0.8  0.4
[978,]  1.0  0.8  0.5
[979,]  1.0  0.8  0.6
[980,]  1.0  0.8  0.7
[981,]  1.0  0.8  0.9
[982,]  1.0  0.9  0.0
[983,]  1.0  0.9  0.1
[984,]  1.0  0.9  0.2
[985,]  1.0  0.9  0.3
[986,]  1.0  0.9  0.4
[987,]  1.0  0.9  0.5
[988,]  1.0  0.9  0.6
[989,]  1.0  0.9  0.7
[990,]  1.0  0.9  0.8
进入更薄的人:

....
[964,]  1.0  0.7  0.0
[965,]  1.0  0.7  0.1
[966,]  1.0  0.7  0.2
[967,]  1.0  0.7  0.3
[968,]  1.0  0.7  0.4
[969,]  1.0  0.7  0.5

行名称不正确,因为我没有计算出它们发生了什么。 我一直在看命令any(x),以及一些不同的()类型命令,但似乎无法发生魔术。

3 个答案:

答案 0 :(得分:1)

我认为codoremifa和我在同一页面上。我们的答案使用相同的逻辑,并为您的样本数据提供相同的值。这是我放在一起的东西:

f <- function(x, threshold = .2) {
 combinations <- combn(length(x),2)
 keep <- all(abs(x[combinations[1,]] - x[combinations[2,]]) > threshold)
 return(keep)
}

然后apply按功能f按行创建TRUE/FALSE值的索引,以选择support.n的相应行:

a <- support.n[apply(support.n, 1,f),]

为了确认我们的答案是一样的,我将codoremifa的答案保存为b

> all.equal(a,b)
[1] TRUE

对于大型对象,无论是行数还是列数,都可以通过提前完成每行计算combn()并简单地在每行中对其进行索引来消除计算{{1}}的开销。然而,这个例子在我的机器上运行了0.05秒,因此不值得在这里制作更复杂的功能。

答案 1 :(得分:0)

这对你有用。 xsupport.n每行的别名,每对组合都是从行元素创建的,每对之间的最小绝对差值是0.2。它返回TRUE/FALSE,然后用于子集support.n -

support.n[
  apply(
    support.n, 
    1, 
    function(x) 
      min(
        abs(
          diff(
            combn(
              x,
              2
              )
            )
          )
        )
    ) > 0.2,
  ]

答案 2 :(得分:0)

我的回答也非常相似,给出了相同的答案。我不认为combn()内容确实是必要的,而是我只是对每一行进行排序并取diff

support.n[ apply(support.n, 1, function(x) all(diff(sort(x)) > .2) ) , ]