根据索引中另一个变量的值检索行号

时间:2018-03-21 19:33:15

标签: stata

这个问题在R中非常简单,但我似乎无法在Stata中使用它。

我想使用方括号索引,但其中包含一个涉及另一个变量的表达式,即我想要的具有唯一值cumul的变量:

replace country = country[cumul==20] in 12

cumul == 20对应于数据集中的行号638,因此上面应该在第12行中将country变量替换为第638行中相同变量的值。上面的表达式显然不是正确的方法:它只是用缺失值替换第12行中的country变量。

2 个答案:

答案 0 :(得分:1)

Stata的行索引不能以这种方式工作。但是,你可以做的是一个简单的两线解决方案:

    levelsof country if cumul==20
    replace  country = "`r(levels)'" in 12

如果您想确保cumul == 20唯一标识一个国家/地区的值,请添加:

    assert `:word count `r(levels)''==1

这两行之间。

答案 1 :(得分:0)

可能值得解释为什么问题中的结构并不能按照您的意愿工作,超出" Stata不是R!"。

给定变量x:在x[1]之类的引用中,[1]被称为下标,尽管没有在该行下面写入任何内容。下标是观察数,该数字始终是数据集中当前保存在内存中的数字。

Stata允许在下标中使用表达式;通过观察对它们进行评估,然后将结果用于查找变量中的值。考虑一下这个沙箱:

clear
input float y
1
2
3
4
5
end

. gen foo = y[mod(_n, 2)]
(2 missing values generated)

. gen x = 3

. gen bar = y[y == x]
(4 missing values generated)

. list

     +-------------------+
     | y   foo   x   bar |
     |-------------------|
  1. | 1     1   3     . |
  2. | 2     .   3     . |
  3. | 3     1   3     1 |
  4. | 4     .   3     . |
  5. | 5     1   3     . |
     +-------------------+

mod(_n, 2)是将观察_n除以2的余数:奇数观测数为1,偶数为0。观察0不在数据集中(Stata开始索引为1)。引用该观察中的值并不是错误,但结果将返回为缺失(此处缺少数字,如果变量为字符串,则为空字符串"")。因此,对于奇数观察数,foox[1]或1,对于偶数,则为y == x

如果为真且0为假,则将真或假表达式计算为1。因此,bar仅在观察3中为真,因此y[1]. gen random = runiform() . sort random . gen obs = _n . sort y . gen randomsorted = random[obs] . l +-----------------------------------------------+ | y foo x bar random obs random~d | |-----------------------------------------------| 1. | 1 1 3 . .3488717 4 .0285569 | 2. | 2 . 3 . .2668857 3 .1366463 | 3. | 3 1 3 1 .1366463 2 .2668857 | 4. | 4 . 3 . .0285569 1 .3488717 | 5. | 5 1 3 . .8689333 5 .8689333 | +-----------------------------------------------+ 的值,并且在其他地方丢失。 Stata在R中没有特殊(和有用)的扭曲,因为它是用于选择零个或多个值的真或假表达式为真的下标。

有一些方法可以使用下标来获得特效。这个例子显示了一个。 (在Mata中获得同样的结果要容易得多。)

//***********************************************//
//* Online Examination System                   *//
//*---------------------------------------------*//

function countDown() {
      sec--;
  if (sec == -01) {
    sec = 59;
    min = min - 1;
    if(min==-01)
        {
            min=59;
            hour=hour-1;
        }else
            {
                hour=hour;
            }
  } else {
   min = min;
  }
if (sec<=9) { sec = "0" + sec; }

  time = (hour<=9 ? "0" + hour : hour) + " : " + (min<=9 ? "0" + min : min) + " : " + sec + "";
if (document.getElementById) { document.getElementById('timer').innerHTML = time; }
  SD=window.setTimeout("countDown();", 1000);
if (hour=='00'&& min == '00' && sec == '00') { sec = "00";min="00"; window.clearTimeout(SD); window.location=document.forms[0].action+"?fs=yes";}
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

addLoadEvent(function() {
  countDown();
});

这个答案并不涵盖Stata或Mata中的矩阵。