2015-09-01 44 views
1

我有一個非常大的矩陣(大約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 

這個輸出是不具體,不包括列號。列名不起作用,因爲有許多列名稱相同。

+0

什麼是這一切結束時的目標是什麼?我感覺'df [,colnames(df)==「Day2」] == 1'會返回一個可用的邏輯矩陣以表示接下來會發生什麼...... – Tensibai

回答

2

這聽起來像,給定一個行號y,每天d你正在尋找所有的列數在原來的基體,其中:

  1. 中的價值行y設置爲1
  2. 列名指示該列爲天d

這是1班輪在R:

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

如果你想要的是得到索引信息,那麼你可以使用arr.ind參數指向which()函數。

​​

#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 
相關問題