【问题标题】:Access element of matrix by value按值访问矩阵的元素
【发布时间】:2015-07-03 14:23:52
【问题描述】:

假设我定义了一个矩阵:

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

我可以像这样访问“13”:

display a[3,2]

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

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

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

Stata 有类似的东西吗?

【问题讨论】:

  • 请注意,您的文本说一行包含 6(暗示在任何列中),但据我了解,您的 R 代码在第一个 only 中查找列。
  • ... 这也不是关于通过 name 访问...
  • 很好 - 我很草率。我更新了文本以反映第一列。我将标题更新为按值而不是按名称。谢谢!

标签: matrix stata


【解决方案1】:

您可以使用 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”是由跨行的“元素等于6”的总数定义的。请注意,如果 (a) 一行中有多个 6 和/或 (b) 有多个带 6 的行,则代码有效。在最后一种情况下,所选内容包含多个元素。

符号应该是不言自明的,除了 : 作为前缀可能表示“元素级”操作。要将 Stata 矩阵复制到 Mata,请使用 st_matrix()

注意:仅在第一列中确定应选择的代码是热心者的练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2020-09-06
    相关资源
    最近更新 更多