2015-07-03 161 views
1

比方说,我定义了一个矩阵:访问元素

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?

+0

请注意,您的文本显示一行包含6(隐含在任何列中),但您的R代码(据我了解)仅在第一列中查找6 **。 –

+0

...也没有关于访问_name_ ... –

+0

良好的捕获 - 我是马虎。我更新了文字以反映第一栏。我更新的标题是按价值而不是按名称。谢谢! – bill999

回答

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 | 
    +-----+ 

“行包含6”由跨行的“元素等于6”的总数定义。注意,如果(a)一行中有多于一个6和/或(b)多于一行为6,则该代码有效。在最后一种情况下,所选内容包含多个元素。

符号似乎不言自明,除了可能:作为前缀信号“元素”操作。要将Stata矩阵复制到Mata中,请使用st_matrix()

注意:确定代码应该在第一列中选​​择的内容仅作为热心的练习。