浏览所有包含零的行和列

时间:2018-10-24 17:52:30

标签: stata

假设我有100个名为if (text.isEmpty() == false) { double value = Double.parseDouble(text); // the factor applied during the conversion double factor = 0; // the offset applied during the conversion. double offset = 0; // Setup the correct factor/offset values depending on required conversion switch (combo.getSelectedIndex()) { case 0: // inches/cm factor = 2.54; break; case 1: // miles/km factor = 1.60; break; case 2: // pounds/kilograms factor = 0.45; break; case 3: // gallons/Litres factor = 4.54; break; case 4: // feet/meters factor = 0.30; break; case 5: // celsius/kelvin factor = 1; offset=273.15; break; case 6: // acres/hectare factor = 2.471; break; } double result = 0; if(reverseCheck.isSelected() == true) { result = factor / value - offset; }else { result = factor * value + offset; } count++; labelCount.setText("Conversion Count: "+count); label.setText(Double.toString(result)); DecimalFormat decFormat = new DecimalFormat("0.00"); decFormat.format(result); 的变量。我有1000行。我想浏览所有包含ID, var1, var2, ..., var99的行和列。

我只想这样做:

0

但是它不起作用。我不想对所有99个变量进行硬编码。

我本质上想写一个if像这样:

browse ID, var* if var* == 0

但是显然那是行不通的。

我是否只需要重塑数据,使其具有2列gen has0 = 0 forvalues n = 1/99 { if var`n' does not contain 0 { drop v } // pseudocode I know doesn't work has0 = has0 | var`n' == 0 } browse if has0 == 1 ,总计100,000行?

2 个答案:

答案 0 :(得分:1)

亲爱的同事@NickCox强迫我回答这个(重复的)问题,因为他声称下载,安装和运行新命令比使用“内置”命令更好。从99个变量中进行选择”。

考虑以下玩具示例:

clear

input var1 var2 var3 var4 var5
1 4 9 5 0
1 8 6 3 7
0 6 5 6 8
4 5 1 8 3
2 1 0 2 1
4 6 7 1 9
end

list

     +----------------------------------+
     | var1   var2   var3   var4   var5 |
     |----------------------------------|
  1. |    1      4      9      5      0 |
  2. |    1      8      6      3      7 |
  3. |    0      6      5      6      8 |
  4. |    4      5      1      8      3 |
  5. |    2      1      0      2      1 |
  6. |    4      6      7      1      9 |
     +----------------------------------+

实际上,您无需下载任何内容:

preserve

generate obsno = _n
reshape long var, i(obsno)

rename var value
generate var = "var" + string(_j)

list var obsno value if value == 0, noobs

  +----------------------+
  |  var   obsno   value |
  |----------------------|
  | var5       1       0 |
  | var1       3       0 |
  | var3       5       0 |
  +----------------------+

levelsof var if value == 0, local(selectedvars) clean

display "`selectedvars'"
var1 var3 var5

restore

这是我在链接的问题中建议的用于识别负值的方法。使用levelsof可以使用内置命令对findname进行相同的操作。

此解决方案也可以适用于browse

preserve

generate obsno = _n
reshape long var, i(obsno)

rename var value
generate var = "var" + string(_j)

browse var obsno value if value == 0

levelsof var if value == 0, local(selectedvars) clean

display "`selectedvars'"

pause

restore

尽管我不明白为什么只想browse就可以list来获得结果。


编辑:

以下是与OP数据集更相似的示例:

clear
set seed 12345
set obs 1000

generate id = int((_n - 1) / 300) + 1

forvalues i = 1 / 100 {
    generate var`i' = rnormal(0, 150)
}

ds var*

foreach var in `r(varlist)' {
    generate rr = runiform()
    replace `var' = 0 if rr < 0.0001
    drop rr
}

应用上述解决方案将得出:

display "`selectedvars'"
var13 var19 var35 var36 var42 var86 var88 var90

list id var obsno value if value == 0, noobs sepby(id)

  +----------------------------+
  | id     var   obsno   value |
  |----------------------------|
  |  1   var86      18       0 |
  |  1   var19     167       0 |
  |  1   var13     226       0 |
  |----------------------------|
  |  2   var88     351       0 |
  |  2   var36     361       0 |
  |  2   var35     401       0 |
  |----------------------------|
  |  3   var42     628       0 |
  |  3   var90     643       0 |
  +----------------------------+

答案 1 :(得分:0)

简短的回答:一串变量的通配符不能插入if限定词中。 (if命令与if限定符不同。)

您的问题与您要的矛盾。在某一时刻,您的伪代码让您drop ping变量! drop对Stata程序员具有明显的破坏性含义:这并不意味着“忽略”。

但是,让我们继续强调browse

findname, any(@ == 0) 

查找任何值为0的变量。search findname, sj查找最新的可下载版本。

请注意

findname, type(numeric) 

将返回r(varlist)中的数字变量(如果指定则返回本地宏)。

然后,几个egen函数竞争为指定的 varlist 在每个观察中找到0:命令findname显然可以帮助您识别哪个 varlist

我们创建一个小沙箱来展示技术:

clear
set obs 5 
gen ID = _n 
forval j = 1/5 { 
    gen var`j' = 1
}
replace var2 = 0 in 2 
replace var3 = 0 in 3 

list 

findname var*, any(@ == 0) local(which) 
egen zero = anymatch(`which'), value(0) 

list `which' if zero 

     +-------------+
     | var2   var3 |
     |-------------|
  2. |    0      1 |
  3. |    1      0 |
     +-------------+

因此,问题分为两个部分:找到带有零的观测值和找到带有零的观测值,然后将信息放在一起。

自然地,findname的使用是可有可无的,因为您可以编写自己的循环来标识感兴趣的变量:

local wanted 

quietly foreach v of var var* { 
    count if `v' == 0 
    if r(N) > 0 local wanted `wanted' `v' 
}

自然也可以browselist:区别仅在于命令名称。