我有一个有数千行和几十列的值矩阵。对于给定的行,$$R_0$$,我希望找到所有其他互补行。互补行定义为:
为了说明这一点,下面是一个玩具矩阵:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 0 0 0.1816416 0 0.1796779
[2,] 0.1889351 0 0 0 0 0
[3,] 0 0 0.1539683 0 0 0.1983812
[4,] 0 0.155489 0.1869410 0 0 0
[5,] 0 0 0 0 0.1739382 0 对于第1行,列4和6有值。互补行必须对列4和6具有"0“。
我不知道我想要的输出应该是什么数据结构。但我知道输出应该告诉我:
也许是一份名单?即:
[1: 2, 3, 5;
2: 1, 3, 4, 5;
3: 2, 5;
4: 1, 2, 5;
5: 1, 2, 3, 4]但我对其他数据结构持开放态度。
下面的代码生成上面的玩具矩阵。
set.seed(1)
a = runif(n=30, min=0, max=0.2)
a[a<0.15] = 0
A = matrix(a, # the data elements
nrow=5, # number of rows
ncol=6, # number of columns
byrow = TRUE) # fill matrix by rows是否有一套或聪明的方法来处理这个问题?
发布于 2019-04-03 05:13:20
我们可以创建一个函数来检查两行的组合是否是一种恭维。
check_compliment <- function(x, y) {
all(A[y, A[x,] != 0] == 0) & sum(c(A[x, ], A[y, ])) < 1
}在这里,我们对列的行y进行子集,其中x不是0,并检查它们的all是否为0。还要检查sum of x和y行是否小于1。
使用outer对每个组合应用此函数
sapply(data.frame(outer(1:nrow(A), 1:nrow(A), Vectorize(check_compliment))), which)
#$X1
#[1] 2 4 5
#$X2
#[1] 1 3 4 5
#$X3
#[1] 2 5
#$X4
#[1] 1 2 5
#$X5
#[1] 1 2 3 4outer步骤为一行的每一个组合提供了TRUE/FALSE值,并指示是否为恭维。
outer(1:nrow(A), 1:nrow(A), Vectorize(check_compliment))
# [,1] [,2] [,3] [,4] [,5]
#[1,] FALSE TRUE FALSE TRUE TRUE
#[2,] TRUE FALSE TRUE TRUE TRUE
#[3,] FALSE TRUE FALSE FALSE TRUE
#[4,] TRUE TRUE FALSE FALSE TRUE
#[5,] TRUE TRUE TRUE TRUE FALSE我们将其转换为数据帧,并使用which获取每一列的索引。
https://stackoverflow.com/questions/55486885
复制相似问题