【问题标题】:How to extract a list of TRUE from matrix in R?如何从R中的矩阵中提取TRUE列表?
【发布时间】:2022-09-22 23:37:20
【问题描述】:

我一直在尝试从 R 中的矩阵中提取“真”的所有组合。 我这里有 5x5 矩阵“MAT”

     99    70    33    36    93
99  TRUE FALSE FALSE FALSE  TRUE
70 FALSE  TRUE FALSE FALSE FALSE
33 FALSE FALSE  TRUE  TRUE  TRUE
36 FALSE FALSE  TRUE  TRUE FALSE
93  TRUE FALSE  TRUE FALSE  TRUE

`dput(MAT)` 
structure(c(TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, 
FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, 
TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE), dim = c(5L, 5L), dimnames = list(
    c(\"99\", \"70\", \"33\", \"36\", \"93\"), c(\"99\", \"70\", \"33\", \"36\", 
    \"93\")))

我想列出 T 的所有组合。我还需要删除重复的组合,因为矩阵具有对称结构。 我想要一个看起来像的结果

     [,1] [,2]
[1,]   99   99
[2,]   99   93
[3,]   70   70
[4,]   33   33
[5,]   33   36
[6,]   33   93
[7,]   36   36
[8,]   93   93

我试过apply(MAT,1,function(data)names(which(data==T))),但结果如下。如果我可以从下面的结果转换为上面的理想结果,那也有效。谢谢你的支持!

$99
[1] \"99\" \"93\"

$70
[1] \"70\"

$33
[1] \"33\" \"36\" \"93\"

$36
[1] \"33\" \"36\"

$93
[1] \"99\" \"33\" \"93\"
  • 请以可复制/可粘贴的有效 R 语法共享示例数据,而不是作为屏幕截图。如果您的矩阵名为MAT,则dput(MAT) 将创建对象的复制/可粘贴版本。
  • 感谢您的评论。我编辑了我最初的帖子!带来不便敬请谅解。

标签: r


【解决方案1】:

这是一种应该有效的方法。

## generate some sample data
set.seed(42)
MAT = matrix(data = runif(26^2) < 0.25, nrow = 26, dimnames = list(LETTERS, LETTERS))

## convert to long format
long = reshape2::melt(MAT, as.is = TRUE)
## filter down to TRUE values  
## and where the first index is lower to deduplicate the symmetry
long = long[long$value & long$Var1 <= long$Var2, ]
long
#     Var1 Var2 value
# 55     C    C  TRUE
# 80     B    D  TRUE
# 82     D    D  TRUE
# 157    A    G  TRUE
# 158    B    G  TRUE
# 159    C    G  TRUE
# 189    G    H  TRUE
# 214    F    I  TRUE
# 237    C    J  TRUE
# ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多