我有一个非常大的矩阵(大约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
此输出不是特定的,不包括列号。列名称没有帮助,因为有许多列具有相同的名称。
答案 0 :(得分:2)
听起来,给定一个行号y
和一天d
,您正在寻找原始矩阵中的所有列号:
y
中的值设置为1 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且列名与指定日期匹配的所有行/列配对,您可以:
which
与arr.ind=TRUE
一起查找子集中设置为1的所有行/列对你可以这样做:
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"
)))