首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:矩阵中不超过阈值的求和元素

R:矩阵中不超过阈值的求和元素
EN

Stack Overflow用户
提问于 2019-04-03 04:02:42
回答 1查看 184关注 0票数 0

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

  1. 如果给定行的列为非零值,则补语必须具有该列的零值。
  2. 给定行及其补语的元素之和必须小于1.0

为了说明这一点,下面是一个玩具矩阵:

代码语言:javascript
复制
     [,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

也许是一份名单?即:

代码语言:javascript
复制
[1: 2, 3, 5;
 2: 1, 3, 4, 5;
 3: 2, 5;
 4: 1, 2, 5;
 5: 1, 2, 3, 4]

但我对其他数据结构持开放态度。

下面的代码生成上面的玩具矩阵。

代码语言:javascript
复制
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

是否有一套或聪明的方法来处理这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-03 05:13:20

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

代码语言:javascript
复制
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 xy行是否小于1。

使用outer对每个组合应用此函数

代码语言:javascript
复制
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值,并指示是否为恭维。

代码语言:javascript
复制
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获取每一列的索引。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55486885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档