使用 `which()` 获取匹配的行和列索引
Posted
技术标签:
【中文标题】使用 `which()` 获取匹配的行和列索引【英文标题】:Get row and column indices of matches using `which()` 【发布时间】:2011-11-22 09:26:49 【问题描述】:假设我有一些矩阵,例如:
m = matrix(rep(c(0, 0, 1), 4), nrow = 4)
m
[,1] [,2] [,3]
[1,] 0 0 1
[2,] 0 1 0
[3,] 1 0 0
[4,] 0 0 1
如果我运行which
,我会得到正常索引列表:
> which(m == 1)
[1] 3 6 9 12
我想得到类似矩阵索引的东西——每个索引都包含行号和列号:
[,1] [,2]
[1,] 3 1
[2,] 2 2
[3,] 1 3
[4,] 4 3
是否有任何简单的函数可以做到这一点?此外,它应该以某种方式包含行名和列名:
> rownames(m) = letters[1:4]
> colnames(m) = letters[5:7]
> m
e f g
a 0 0 1
b 0 1 0
c 1 0 0
d 0 0 1
但我现在不知道如何,也许像
[,1] [,2] [,3] [,4]
[1,] 3 1 c e
[2,] 2 2 b f
[3,] 1 3 a g
[4,] 4 3 d g
或者,可能返回 2 个向量(用于行和列),例如
c b a d
3 2 1 4
e f g g
1 2 3 3
【问题讨论】:
见one of my older questions 【参考方案1】:对于您的第一个问题,您还需要将arr.ind= TRUE
传递给which
:
> which(m == 1, arr.ind = TRUE)
row col
[1,] 3 1
[2,] 2 2
[3,] 1 3
[4,] 4 3
【讨论】:
酷,谢谢!我正在查看?which
帮助,但它说:“arr.ind 逻辑 - 当 x 是数组时应该返回数组索引吗?”,这很漂亮令人困惑!为什么他们在返回矩阵索引时会提到数组索引? (对于数组,我通常是指一维向量)
"array" 是更一般的情况,包括具有退化单维的“向量”、矩阵(具有 2 个维度)和 3D、4D、... 数组 - 没有维度的向量不是从这个意义上说是一维的,记住也有递归向量(列表)
@TomasT。数组可以有 1、2 或更多维度。矩阵是二维数组的特例。见?matrix
和?array
。
我不敢相信我从来不知道arr.ind
!为此,我一直使用一些可怕的低效技巧,依赖于对 row()
和 col()
的调用。【参考方案2】:
您不能在矩阵中混合数字和 alpha,但可以在 data.frame 中:
> indices <- data.frame(ind= which(m == 1, arr.ind=TRUE))
> indices$rnm <- rownames(m)[indices$ind.row]
> indices$cnm <- colnames(m)[indices$ind.col]
> indices
ind.row ind.col rnm cnm
c 3 1 c e
b 2 2 b f
a 1 3 a g
d 4 3 d g
【讨论】:
以上是关于使用 `which()` 获取匹配的行和列索引的主要内容,如果未能解决你的问题,请参考以下文章
pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用xs函数获取行切面数据(level参数指定行层索引列表key参数指定索引值列表)