使用 `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()` 获取匹配的行和列索引的主要内容,如果未能解决你的问题,请参考以下文章

确定表中输入的行和列索引

React - 单击表上的数据返回错误的行和列索引

根据名称向量获取列索引(在R中)

pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用xs函数获取行切面数据(level参数指定行层索引列表key参数指定索引值列表)

通过apache poi以excel方式获取索引值

如何使用 jQuery 获取表列索引?