我正在使用大量组合。我想要一种方法来消除它们中的一部分,这样就可以消除元素靠近在一起的所有组合(由我设置关闭)。 (注意,它可能需要一两秒,它相当大)。
我们举个例子:
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),以及一些不同的()类型命令,但似乎无法发生魔术。
答案 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)
这对你有用。 x
是support.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) ) , ]