IT序号网

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

lonelyxmas 2024年06月20日 编程语言 76 0

我正在处理大量组合。我想要一种方法来消除其中的一部分,以便消除元素靠在一起的所有组合(其中 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 秒,因此不值得在这里制作更复杂的函数。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!