【问题标题】:Combining a matrix of TRUE/FALSE into one将 TRUE/FALSE 矩阵合并为一个
【发布时间】:2012-08-06 01:15:08
【问题描述】:

如果我有这个矩阵(我将其命名为数据):

     [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]
[1,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
[2,] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
[5,] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[7,] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
[8,] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
[9,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

我想将这些列组合成一列,如下所示:(其中行中的一个 TRUE 等于 TRUE)

      [,1]   
 [1,] TRUE 
 [2,] TRUE 
 [3,] FALSE 
 [4,] TRUE   
 [5,] TRUE 
 [6,] FALSE  
 [7,] TRUE   
 [8,] TRUE  
 [9,] FALSE  

我知道我可以做类似的事情(使用 |):

  data2[1:9,1]<-data[,1]|data[,2]|data[,3]|data[,4]…

data2 然后将包含一个包含不同列组合的列。但如果我有很多列(例如 ncol=100),这不是一个好方法

我想有一些简单的方法吗?

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    这是另一个利用 R 如何在逻辑和数字之间转换的答案:

    当从逻辑变为数字时,FALSE 变为 0TRUE 变为 1,因此 rowSums 为您提供每行 TRUE 的数量:

    rowSums(data)
    # [1] 3 3 0 3 3 0 3 3 0
    

    当从数字变为逻辑时,0 变为 FALSE,其他为 TRUE,因此您可以将 rowSums 的输出提供给 as.logical,它将指示一行是否至少有一个TRUE:

    as.logical(rowSums(data))
    # [1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
    

    不过,我喜欢 Tyler 的回答,它可能效率较低(有待证明),但我觉得它更直观。

    【讨论】:

    • @flodel 我把它放在了板凳上,你的假设得到了证实。 +1
    • @TylerRinker,我认为更快(对我来说,也很直观)rowSums(data) &gt; 0 也有效。
    【解决方案2】:

    您可以将anyapply 一起使用,如下所示:

    mat <- matrix(sample(c(TRUE, FALSE), 100,TRUE), 10)
    apply(mat, 1, any)
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2018-05-03
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多