【问题标题】:Create sub-matrices that have identical cell values创建具有相同单元格值的子矩阵
【发布时间】:2014-10-20 22:17:07
【问题描述】:

我有一个包含许多行和列的矩阵 (rxp),我正在尝试创建一个仅包含具有相同单元格值的行和列的子矩阵。例如

这是我的矩阵

   a  b  c  d 
a  0  1  1  1  
b  1  0  0  1
c  1  0  0  1
d  0  1  0  0
e  0  1  1  1

这里的行bc 具有相同的值,因此代码应该创建第一个子矩阵,其中只有bc 行,第二个子矩阵行ae

   a  b  c  d
b  1  0  0  1
c  1  0  0  1

   a  b  c  d
a  0  1  1  1 
e  0  1  1  1

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    可能有不止一组重复的行,所以如果m 是您的矩阵,这将创建一个矩阵列表,其中每个这样的矩阵都有重复的行:

    DF <- as.data.frame(m)
    Filter(function(x) nrow(x) > 1, split(DF, do.call(paste, DF)))
    

    【讨论】:

    • 对,这样更合适
    • @Grothendieck,我喜欢将我的数据集保存为矩阵格式
    【解决方案2】:

    您可以双向使用duplicated

    m[duplicated(m) | duplicated(m, fromLast=TRUE),]
    #   a b c d
    # b 1 0 0 1
    # c 1 0 0 1
    

    m 在哪里

    structure(c(0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 
    1L, 1L, 0L), .Dim = c(4L, 4L), .Dimnames = list(c("a", "b", "c", 
    "d"), c("a", "b", "c", "d")))
    

    【讨论】:

    • 我认为 m[duplicated(m, fromLast=TRUE) | duplicated(m, fromLast=FALSE),] 可以在不需要 sapply 的情况下工作。
    • 没错!我正在使用&amp; 并且搞混了。干杯!
    • @RichardScriven 抱歉,我更新了我的问题。代码应该为相同值的每个组合创建单独的子矩阵,现在 m[duplicate....] 只是创建一个子矩阵,其中所有相同的组合集中在一起。我厌倦了在 m[duplicated...] 上做 m[duplicated ..] .. 没用
    • 这就是为什么我认为另一个答案更合适:)
    • @RichardScriven 啊 :) 太完美了
    【解决方案3】:

    你也可以使用。

     indx <- which(duplicated(m)) #m from @Richard Scriven post
    

    返回一个矩阵列表

     lapply(indx, function(i) m[colSums(t(m)==m[i,])==ncol(m),])
     [[1]]
     #  a b c d
     #b 1 0 0 1
     #c 1 0 0 1
    
     [[2]]
     #  a b c d
     #a 0 1 1 1
     #e 0 1 1 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2016-02-23
      相关资源
      最近更新 更多