【问题标题】:Check if vector in a matrix检查向量是否在矩阵中
【发布时间】:2020-07-02 09:20:32
【问题描述】:

我有一个矩阵

new<-matrix(9,4,4)
new[1,1]<-0

v1<-c(0,0)

new 因此看起来像这样:

0 9 9 9 
9 9 9 9
9 9 9 9
9 9 9 9

我现在想检查这个矩阵是否包含向量 v1。 所以我做到了

v1 %in% new 

并获得 TRUE TRUE 虽然我想检查一行/列中两个零的整个向量,因此 想得到一个 FALSE。

【问题讨论】:

  • 所以如果水平/垂直连续有两个 0 你想获得TRUE

标签: r matrix


【解决方案1】:

您可以使用zoo 中的rollapply 来测试矩阵是否包含向量

library(zoo)
any(apply(new, 2, rollapply, length(v1), identical, v1))
#[1] FALSE

new[2,1] <- 0
any(apply(new, 2, rollapply, length(v1), identical, v1))
#[1] TRUE

【讨论】:

    【解决方案2】:

    您可以使用isTRUEall.equal 的组合,而intersect 是带有矩阵的向量,即

    isTRUE(all.equal(v1, intersect(v1, new)))
    #[1] FALSE
    
    v2 <- c(0, 9)
    all.equal(v2, intersect(v2, new))
    #[1] TRUE
    

    【讨论】:

      【解决方案3】:

      这是你想要的吗?

      向量有两个值,所以如果你想检查它是否包含在矩阵中,你必须将两个值粘贴在一起以获得0,0

      paste0(v1, collapse = ",") %in% new
      [1] FALSE
      

      或者这个,它将粘贴在一起的向量中的字符串0,0与矩阵的粘贴在一起的行进行比较:

      paste0(v1, collapse = ",") %in% apply(new, 2, paste0, collapse = ",")
      [1] FALSE
      

      或者这个,它在矩阵的粘贴在一起的行中以逗号分隔的对应的两个数字对中搜索0,0

      library(stringr)
      paste0(v1, collapse = ",") %in% unlist(str_split(apply(new, 2, paste0, collapse = ","), "(?<=\\d,\\d),(?=\\d,\\d)"))
      

      后一种解决方案似乎最有可能,因为它搜索 0,0 %in% 这个向量,这是 unlist(str_split(apply(new, 2, paste0, collapse = ","), "(?&lt;=\\d,\\d),(?=\\d,\\d)")) 的输出:

      [1] "0,9" "9,9" "9,9" "9,9" "9,9" "9,9" "9,9" "9,9"
      

      【讨论】:

      • 谢谢!这已经很有帮助了。我将如何编辑代码以在矩阵中查找矩阵?这样不仅是水平向量 (0,0),还要区分具有 (0,0) 项的 (1,2) 和 (2,1) 矩阵?
      • 我想这值得提出一个新问题。如果有帮助,请考虑接受或支持我的回答。
      • 我做了,但不幸的是,由于声誉太低,我的票还没有投票
      猜你喜欢
      • 2011-05-16
      • 2015-12-14
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多