R:求和矩阵中的元素达到阈值

时间:2019-04-03 04:02:43

标签: r

我有一个包含数千行和几十列的值矩阵。对于给定的$$ R_0 $$行,我想查找所有其他互补行。互补行定义为:

  1. 如果给定的行的某个列的值非零,那么补码对该列的值必须为零
  2. 给定行及其补数的元素之和必须小于1.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

也许是列表列表?即:

[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

是否有解决此问题的软件包或巧妙的方法?

1 个答案:

答案 0 :(得分:2)

我们可以创建一个函数来检查两行的组合是否是恭维

check_compliment <- function(x, y) {
  all(A[y, A[x,] != 0] == 0) & sum(c(A[x, ], A[y, ])) < 1
}

在这里,我们为y不为0的列设置了行x的子集,并检查其中的all是否为0。还要检查{{1}的sum }和x行小于1。

使用y

对每个组合应用此功能
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 4 步骤为我们提供了行与其他行的每种组合的outer / 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 获取每一列的索引。