如何根据行和列条件查找矩阵中的特定元素

时间:2015-09-01 14:48:00

标签: r matrix

我有一个非常大的矩阵(大约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)对于任何1,行y值等于'y'

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

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

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

    Day 1 
        1 

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

3 个答案:

答案 0 :(得分:2)

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

  1. y中的值设置为1
  2. 列名称表示该列适用于日d
  3. 这是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. 将列号映射回原始矩阵的列号
    4. 你可以这样做:

      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
      

答案 1 :(得分:1)

如果您只想获取索引信息,那么可以使用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

答案 2 :(得分:0)

这是一种方式:

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"
)))