【问题标题】:How to find specific element in a matrix dependent on row and column conditions如何根据行和列条件在矩阵中查找特定元素
【发布时间】:2015-09-01 14:47:59
【问题描述】:

我有一个非常大的矩阵(大约 30,000,000 列),其中包含许多同名的列。我试图找到满足某些行和列条件的条目的行号和列号。例如,我的矩阵的前几个条目如下:

             Day 1     Day 1     Day 1     Day 1     Day 1     Day 2     Day 2     Day 2     Day 2     Day 2
[1,]         1         0         0         0         0         0         1         0         0         0
[2,]         0         0         0         0         0         0         0         0         0         0
[3,]         0         0         0         0         0         0         0         0         0         0

我想要的是有一个命令,或者创建一个函数来告诉我列名等于Weekday 'x'(对于任何x)和行y值的条目的行号和列号等于1,对于任何'y'

我输入的每个组合只有一个答案,但我的代码无法正常工作。

例如,我知道条目[1,1] 的值是1,所以我写了:

   > w1 <- which(colnames(year)=="Day 1")
   > wd1 <- (year[1,w1]==1)
   > which(wd1==T)

    Day 1 
        1 

此输出不具体,不包括列号。列名没有帮助,因为有许多列具有相同的名称。

【问题讨论】:

  • 这一切的最终目的是什么?我感觉df[,colnames(df) == "Day2"] == 1 会返回一个可用的逻辑矩阵来表示接下来会发生什么......

标签: r matrix


【解决方案1】:

听起来,给定行号y 和一天d,您正在寻找原始矩阵中的所有列号:

  1. y 行中的值设置为 1
  2. 列名表示该列适用于d

这是 R 中的 1-liner:

get.cols <- function(y, d) unname(which(year[y,] == 1 & colnames(year) == paste("Day", d)))
get.cols(1, 1)
# [1] 1
get.cols(2, 1)
# integer(0)
get.cols(1, 2)
# [1] 7

如果您想查找矩阵设置为 1 且列名与指定日期匹配的所有行/列配对,您可以:

  1. 将矩阵子集到指定日期的列
  2. 使用whicharr.ind=TRUE 查找子集中设置为1 的所有行/列对
  3. 将列号映射回原始矩阵的列号

你可以这样做:

get.rowcol <- function(day) {
  w <- which(colnames(year)==paste("Day", day))
  matches <- which(year[,w] == 1, arr.ind=TRUE)
  matches[,"col"] <- w[matches[,"col"]]  # Map column numbers from subset to full matrix
  matches
}
get.rowcol(1)
#      row col
# [1,]   1   1
get.rowcol(2)
#      row col
# [1,]   1   7

【讨论】:

    【解决方案2】:

    如果您只想获取索引信息,则可以将 arr.ind 参数用于 which() 函数。

    #for any entry = 1
    which(year == 1, arr.ind=TRUE)
    

    #for your example of a specific column name and entry value
    which(colnames(year) == "Day1" & year == 1, arr.ind=TRUE) 
    
    Working example:
    year <- structure(c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L), .Dim = c(3L, 10L), .Dimnames = list(NULL, c("Day1", "Day1", 
    "Day1", "Day1", "Day1", "Day2", "Day2", "Day2", "Day2", "Day2"
    )))
    which(colnames(year) == "Day1" & year==1, arr.ind=TRUE)
    #      row col
    # [1,]   1   1
    

    【讨论】:

      【解决方案3】:

      这是一种方法:

      indx <- function(colNAME, num=1) {
        cols <- which(colnames(year) == colNAME)
        x <- which(year[,cols] == num)
        clmn <- cols[ceiling(x/nrow(year))]
        rw <- x %% nrow(year)
        matrix(c(rw,clmn),ncol=2)
      }
      
      indx("Day1")
           [,1] [,2]
      [1,]    1    1
      

      在输出中,第一列是行,第二列是列。

      数据

      year <- structure(c(1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
      0L), .Dim = c(3L, 10L), .Dimnames = list(NULL, c("Day1", "Day1", 
      "Day1", "Day1", "Day1", "Day2", "Day2", "Day2", "Day2", "Day2"
      )))
      

      【讨论】:

        猜你喜欢
        • 2020-04-30
        • 2017-10-03
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        相关资源
        最近更新 更多