按值访问矩阵元素

Access element of matrix by value

假设我定义了一个矩阵:

 matrix a = (2,3 \ 4,7 \ 6,13)

我可以这样访问“13”:

display a[3,2]

是否也可以在引用“6”指定行的同时访问“13”?换句话说,我们会以某种方式表示该行是第一列中包含 6 的行(可能不止一个),然后我们需要该行的第二列。

在 R 中,我们可能会这样做:

a1 <- data.frame(c(2,4,6), c(3,7,13))
a1[a1[,1]==6, 2]

Stata 中有类似的东西吗?

您可以使用 Stata 的矩阵语言和一些编程来做到这一点,但我会转向 Mata,其定义的函数允许在精神上类似于 R 的直接解决方案。考虑这个对话。

. mata
------------------------------------------------- mata (type end to exit) --------------
: a = (2,3 \ 4,7 \ 6,13)

: a :== 1
       1   2
    +---------+
  1 |  0   0  |
  2 |  0   0  |
  3 |  0   0  |
    +---------+

: a :== 6
       1   2
    +---------+
  1 |  0   0  |
  2 |  0   0  |
  3 |  1   0  |
    +---------+

: rowsum(a :== 6)
       1
    +-----+
  1 |  0  |
  2 |  0  |
  3 |  1  |
    +-----+

: select(a, rowsum(a :== 6))
        1    2
    +-----------+
  1 |   6   13  |
    +-----------+

: a2 = select(a, rowsum(a :== 6))

: a2[, 2]
  13

:  b = (6,6 \ 6,6 \ 6,6)

: select(b, rowsum(b :== 6))
       1   2
    +---------+
  1 |  6   6  |
  2 |  6   6  |
  3 |  6   6  |
    +---------+

: b2 = select(b, rowsum(b :== 6))

: b2[, 2]
       1
    +-----+
  1 |  6  |
  2 |  6  |
  3 |  6  |
    +-----+

"row contains a 6" 由跨行的总 "element is equal to 6" 定义。请注意,如果 (a) 一行中有多个 6 and/or (b) 有多个行带有 6,则代码有效。在最后一种情况下,selected 包含不止一个元素。

这个符号看起来应该是不言自明的,除了可能 : 作为前缀表示 "elementwise" 操作。要将 Stata 矩阵复制到 Mata 中,请使用 st_matrix()

注意:仅将第一列中 select 的代码设置为热心者的练习。