3.2.1 数值变量:
用0、1、2?9 及+、–(正负号)与小数点“(.)”来表示。在输入数据时, 逗号不能被识别,如1,024 应该直接写成1024. 5 -5 5.2 5.2e+3 5.2e-2
后面两个数据为科学计数法的数据,分别表示5200 和0.052.其中的e 相当 于10,因此5.2e+3 的意思是:5.2*103=5200
数值型变量按其精度区分,又有五种类型,分别是:
存贮类型 最小 最大 0-领域 字节
--------------------------------------------------------------------- byte -127 100 +/-1 1 int -32,767 32,740 +/-1 2 long -2,147,483,647 2,147,483,620 +/-1 4 float -1.70141173319*10^38 1.70141173319*10^36 +/-10^-36 4 double -8.9884656743*10^307 8.9884656743*10^307 +/-10^-323 8 当运算精度要求很高的时候,需要将变量设置成浮点型或双精度型。
另注意1 和1.0000 的精度是不同的,前者在(0.5,1.5)区间内近似,而后者在 (0.99995,1.00005)区间内近似。若多次运算反复取四舍五入,精度较低时将使 计算误差迅速变大,然而,精度高时占用的内存资源较多。下面的命令有助于理 解变量存贮类型变换。 . clear
. set obs 1 //将设定一个观察值
obs was 0, now 1 //提示信息说,之前系统中没有观察单位,现在有了一个 . gen a=1 //生成一个新变量a,令a 取值为1
. d /*d 为describ 命令的略写,describ 命令显示数据集的
属性信息,注意观察显示结果中,a 的storage type 为float 型, 浮点型为默认类型*/
Contains data obs: 1 vars: 1
size: 8 (99.9% of memory free) storage display value
variable name type format label variable label a float %9.0g Sorted by:
Note: dataset has changed since last saved
. compress //在不损害信息的基础上压缩,使数据占用空间尽可能小 a was float, now byte //a 由浮点型变为了字节型 . d // 注意a 的storage type 现在为byte 型
. replace a=101 /* 注意a 的storage type 现在自动升为int 型,
因为byte 最大只能为100*/
a was byte now int (1 real change made) . replace a=100 . compress
. d //重新变回到byte 型
. replace a=32741 //直接变到long 型,因为int 型最大只能到32740 . gen double b=1 //直接生成双精度变量b . recast double a //将a 变成双精度变量b
. d //注意到a 和b 均为双精度型
3.2.2 字符串变量
字符变量通常是一些身份信息,如姓名,地名。另外,定类变量也可以用字 符变量来表示,如性别分为“男”和“女”。
字符串变量由字母或一些特殊的符号组成(如地名〈籍贯〉变量,迁出地, 住址,职业等等)。字符串变量也可以由数字来组成,但数字在这里仅代表一些 符号而不再是数字。字符串变量通常以引号“”注标,而且引号一般不被视同为 字符的一部分,注意这里的引号必须是英文输入状态下的引号。
字符串最多可以达244 个字符。一般用str#来表示字符的多少,如str20 表示将有20 个字符。一般三个中文字的姓名需要6 个字符。 字符型示例 “String” “string” ” string” ”string ”
”” //特殊字符串,表示空字符,缺失值。 ” ” //注意与空字符串的区别,含有一个空格
”125.27” //”125.27”由于有双引号,将被视同为字符而非数值。 “$2,343.68” “I love you” “旺材是条狗”
注意前四个字符串均不相同,大小写是不一样的,有无空格及空格的位置不 同,都表示不同的字符串。对于”125.27”这样的数值型的字符串,可以用real() 函数或者destring 命令转化成数值型变量。具体操作见3.3.1。 3.2.3 日期型变量
在STATA 中,1960 年1 月1 日被认为是第0 天,因此1959 年12 月31 日为 第-1 天,2001 年1 月25 日为15000 天。对日期型变量的讨论将在后面的时间序
3.2.4 缺失值
没有意义的计算结果显示为”.” . display 2/0
另一种情况是,数据中含有缺失值,而STATA 默认的缺失值也用“.”来表
示。在有些数据文件中,缺失值不是用“.”或者空来表示的,而是用-9996 等
来表示,如果要将其全部替换为“.”,或者反之,将“.”替换为-9996,命令 为:
. mvencode age,mv(-9996) . mvdecode age,mv(-9996) 3.3 数据类型转化
任务:将 destring1, destring2 和tostring 中的数据类型进行相互转化
*3.3.1 字符型转化成数值型:destring
*destring1数据中的数据全为字符型,转换为数值型 .webuse destring1, clear
.des /*注意到所有的变量存贮类型(storage type)均为字符型str#,
其中#号表示字符串长度*/
Contains data from http://www.stata-press.com/data/r9/destring1.dta obs: 10
vars: 5 3 Mar 2005 10:15
size: 240 (99.9% of memory free) storage display value
variable name type format label variable label id str3 %9s num str3 %9s code str4 %9s total str5 %9s income str5 %9s
.sum //因为所有变量为字符型,所以不能进行数值计算 .gen nincom=incom+10 //因字符不能进行四则运算,不能进行加法运算
*type mismatch //系统提示类型不匹配,因为income 为字符型,10 为数值型 .destring, replace //全部转换为数值型,replace 表示将原来的变量(值)更新 .sum //注意到转换为数值型后,可以求五数概略了 .gen nincom=income*1.3 //转换后,可以运算,工资终于涨了30%! .list nincom income //工资终于涨了30%!
*----------------将字符型数据转换为数值型数据:去掉字符间的空格------------ *destring2 数据集中的data 变量为字符型,且年月日间有空格,转移为数据型 .webuse destring2, clear
.des //注意到所有的变量均为字符型 str .list date //注意到date 年月日之间均有空格 date
------------ 1. 1999 12 10 2. 2000 07 08 3. 1997 03 02 4. 1999 09 00
.destring date, replace //想把date 转换成数值型,但失败了,系统提示说 *date contains non-numeric characters; no replace /*由于含有非数值型字符
(即空格),因此没有更新,也即转换命令没有执行。*/
.destring date, replace ignore(“ ”) /*忽略空格,然后转换,注意这里的” “中
间有一个空格,不是””。*/
date: characters space removed; replaced as long //成功转换为long 型 .des //注意到date 的storage type 已变为long .list date //注意到空格消失了 date ---------- 1. 19991210 2. 20000708 3. 19970302
/*与date 变量类似,变量price 前面有美元符号,变量percent 后有百分号, 换为数值型时需要忽略这些非数值型字符。*/
.destring price percent, gen(price2 percent2) ignore(“$ ,%”)
.list //注意到price2 前面的$号消失,percent2 后面的%号消失 date price price2 percent percent2
--------------------------------------------------------- 1. 19991210 $2,343.68 2343.68 34% 34 2. 20000708 $7,233.44 7233.44 86% 86
.d //注意到price2 和percent2 均变为数据值型变量double 和byte *3.3.2 数值型转化为字符型:tostring
.webuse tostring, clear /*该数据中年月日的数据类型不一样,不能直接相加
生成一个反映日期的新变量*/
.des //注意到month 为字符型,而年和日为数值型 .list
.gen date1=month+”/”+day+”/”+year //将年月日构成一个新的日期变量 type mismatch //由于month 为字符型,年和日为数值型,不同类型不能相加 r(109);
.tostring year day, replace //将年和日转化为字符型 .des //注意到,现在全部变为字符型
.gen date1=month+”/”+day+”/”+year //将年月日构成一个新的日期变量 .list //生成了一个新的变量date1,其为三个字符串和两个”/”符号连接而成 .gen date2=date(date1,”mdy”) /* date()为日期函数,它以1960 年1 月1
日为第0 天,计算从那天起直到括号中指定的某天date1 一共过了多少天。”mdy”指定date1 的排列顺序,这里是 按照月日年的顺序来表示日期。*/
.list //新生成的date2 表示总天数
*小游戏:请算算你活了多少天?示例:一个生于1975 年12 月27 日的家伙, 他活了?
.di date(“1975/12/27”,”ymd”)
3.4 数据显示格式:format
/*format 只控制数据的显示格式,并不改变内存中数据的大小。*/ .webuse census10,clear //美国人口普查数据