假设我有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行?
答案 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'
}
自然也可以browse
和list
:区别仅在于命令名称。