我正在处理大量组合。我想要一种方法来消除其中的一部分,以便消除元素靠在一起的所有组合(其中 close 由我设置)。 (注意,它可能需要一两秒,它相当大)。
举个例子:
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) 和一些各种 which() 类型的命令,但似乎无法让魔法发生。
请您参考如下方法:
我认为 codoremifa 和我在同一页面上。我们的答案使用相同的逻辑并为您的示例数据提供相同的值。这是我放在一起的:
f <- function(x, threshold = .2) {
combinations <- combn(length(x),2)
keep <- all(abs(x[combinations[1,]] - x[combinations[2,]]) > threshold)
return(keep)
}
然后应用
函数f
,按行创建TRUE/FALSE
值的索引,以选择的适当行支持.n
:
a <- support.n[apply(support.n, 1,f),]
为了确认我们的答案相同,我将 codoremifa 的答案保存为 b
:
> all.equal(a,b)
[1] TRUE
对于大对象,无论是行数还是列数,您都可以通过提前计算 combn()
并简单地建立索引来消除计算每一行的开销它在每一行。然而,这个示例在我的机器上运行时间为 0.05 秒,因此不值得在这里制作更复杂的函数。