2017-02-18 83 views
1

生成新的使用可变最小值/最大值后从塔塔长年在外,我目前正在编辑的代码,反复做这样的事情:在Stata

egen min = min(x) 
egen max = max(x) 
generate xn = (x - min)/(max - min) 
drop min max 

我想这个代码减少一行。但是我脑海中的两种“自然”方式都没有奏效。

gen x_index = (x - min(x))/(max(x)- min(x)) 
egen x_index = (x - min(x))/(max(x)- min(x)) 

我缺少哪些Stata逻辑?

回答

2

Stata函数max()min()需要两个或多个参数,并且如果给定一个变量作为参数中的任何一个,则需要逐行操作(跨越观察值)。在例如help max()

egen函数max()min()只能在egen调用中使用。它们可以应用单个变量,但是它们用于计算单个最大值或最小值的用法是非常低效的,除非特殊情况下将单个结果存储在变量中非常重要。除了help egen的警告外,还有其他记录。

你认为两种方法都不会变得更加迂回。考虑

su x, meanonly 
gen x_index = (x - r(min))/(r(max)- r(min)) 

在某些情况下,它可能是更有效的计算只是一次范围:

su x, meanonly 
scalar range = r(max) - r(min) 
gen x_index = (x - r(min))/range 

在程序通常会更好地给标一个临时名称。

egen之内,一个egen函数只能被调用一次。

+0

谢谢,atm我更关心可读性而非效率。如果我用'qui su x'代替'su x',它会是平等的吗? – snoram

+0

否;这不等同。这很容易从“帮助汇总”中推断出来。 “总结”不仅仅是“总结,只是”。 –

+0

我的意思是我们在这里的目的等于**,然后再调用r()。 – snoram