generate — 创建或更改变量的内容

2019-05-02  本文已影响0人  松柏林stata

描述

generate 创建一个新变量。 变量的值由 = exp 指定。 如果未指定类型,则新变量类型由 = exp 返回的结果类型确定。 如果结果是数字,则创建 float 变量(或根据set类型的 double ),如果结果是字符串,则创建字符串变量。 在后一种情况下,如果字符串变量包含大于2,045个字符的值或包含二进制0(\ 0)的值,则会创建一个 strL 变量。 否则,将创建一个 str# 变量,其中#是保存结果的最小字符串。 如果指定了类型,则 = exp 返回的结果必须是字符串或数字,具体取决于是否 type 是字符串或数字。 如果指定了 str ,则使用与上面相同的规则创建 strL 或 str# 变量。
有关 generate 的扩展,请参见[D] egen。
replace会更改现有变量的内容。 由于 replace 会更改数据,因此命令不能缩写。
set type 指定在未明确指定存储类型时分配给新变量(例如由generate 创建的变量)的默认存储类型。

快速入门

Create numeric variable newv1 equal to v1 + 2

generate newv1 = v1 + 2

As above, but use type byte and label the values of newv1 with value label mylabel

generate byte newv1:mylabel = v1 + 2

String variable newv2 equal to “my text”

generate newv2 = "my text"

Variable newv3 equal to the observation number

generate newv3 = _n

Replace newv3 with observation number within each value of catvar

by catvar: replace newv3 = _n

Binary indicator for first observation within each value of catvar after sorting on v2

bysort catvar (v2): generate byte first = _n==1

As above, but for last observation

bysort catvar (v2): generate byte last = _n==_N

Combined datetime variable newv4 from %td formatted date and %tc formatted time

generate double newv4 = cofd(date) + time

语法

生成新变量

generate [type] newvar[:lblname] =exp [if] [in]
 [, before(varname) | after(varname)]

替换现有变量的内容

replace oldvar =exp [if] [in] [, nopromote]

指定分配给新变量的默认存储类型

set type {float|double} [, permanently]

其中类型是 byte|int|long|float|double|str|str1|str2|...|str2045
有关 str 的说明,请参阅下面的说明。 对于其他类型,请参见 [D] data types。by 允许与 generate 和 replace 连接; see 请参见 by.

Options 选项

before(varname) or after(varname) :可以与 generate 一起使用以将新生成的变量放置在数据集内的特定位置。 这些选项主要由数据编辑器使用,在其他上下文中使用有限。 对于大多数用户来说,更受欢迎的替代方案是 order(参见[D] order)。
nopromote:防止替换提升变量类型以适应变化。 例如,考虑存储为整数类型(byte,int或long)的变量,并假设您使用非整数替换某些值。 默认情况下,replace 将变量类型更改为浮点(float或double),从而正确存储更改的值。 类似地,如果替换值是整数但是对于当前存储类型的绝对值太大,则 replace 会将 byte 和 int 变量提升为更长的整数(int和long)。 replace将字符串提升为更长的字符串 nopromote 防止替换这样做; 相反,替换值被截断以适合当前存储类型。
permanently: 指定除了立即进行更改外,还要记住新限制并在调用Stata 时成为默认设置。

generate and replace

generate and replace 分别用于创建新变量和修改现有变量的内容。尽管这些命令执行相同的操作,但是它们有不同的名称,因此您不会意外地替换数据中的值。表达式的详细描述在[U]13 Functions and expressions 中给出。也可以参见[D] edit。

例子1

先前定义为年 age^2(即age2)。 我们已经更改了一些年龄数据,现在想要更正age2来反映新的数据。

use http://www.stata-press.com/data/r15/genxmpl1
generate age2=age^2

age2 already defined
r(110);
当我们使用 replace 时,我们会被告知对数据集所做的实际更改的数量。 您可以通过将类型(如 byte,int,long,float,double 或 str8 )放在变量名称前面来显式指定要创建的新变量的存储类型。 例如,您可以键入generate double revenue = qty * price。 如果变量是数字,则不指定类型等效于指定float,或者更准确地说,它等同于指定set type 命令设置的默认类型; 见下文。 如果变量是字母数字,则不指定类型等同于指定 str#,其中#是变量中最大字符串的长度。
您还可以通过在变量名后面包含 “:lblname” 来指定与新变量关联的值标签。很少这样做,因为以后总是可以使用 label values 命令关联value 标签;见[U]12.6.3 Value labels。

例子 2

我们数据集中的变量之一是 name,它包含每个人的名字和姓氏。我们希望创建一个名为 lastname 的新变量,然后我们将使用它来对数据进行排序。 name 是一个字符串变量。

 generate lastname = word(name,2)
describe

Stata很聪明。 即使我们没有在generate语句中指定存储类型,Stata也知道要创建一个 str9 lastname 变量,因为最长的姓氏是Bimslager,它有9个字符。

例子3

我们希望创建一个新变量age2,它表示变量年龄的平方。 我们意识到,因为年龄是一个整数,age2也将是一个整数,肯定会小于32,740。 因此,我们决定将age2存储为int以节省内存:

use http://www.stata-press.com/data/r15/genxmpl3, clear
generate int age2=age^2

使用 int 之前的 age2 告诉 Stata 该变量将被存储为int。 创建新变量后,Stata 通知我们生成了9个缺失值。 generate 每当缺失值生成时将会通知我们。

技术说明

如果指定 If 或 in 限定符,则仅对满足指定条件或位于指定范围内的观察值求 =exp 的值(或两者都求值,如果同时指定 If 和 in )。新变量的其他观测值被设置为 missing

use http://www.stata-press.com/data/r15/genxmpl3, clear
generate int age2=age^2 if age>30

(290 missing values generated)

例子4

replace可用于仅更改一个值,以及对我们的数据进行全面更改。 例如,假设我们输入前五个奇数甚至正整数的数据,然后发现我们弄错了:

use http://www.stata-press.com/data/r15/genxmpl4, clear
list

第三个观察是错误的; odd的值应为5,而不是-8。 我们可以使用replace来纠正错误:

replace odd=5 in 3

(1 real change made)
如果奇数== - 8,我们也可以通过输入replace odd = 5来纠正错误。

设置类型

当您创建一个新的数字变量并且没有为它指定存储类型时,例如,通过输入生成y = x + 2,如果您之前没有发出set type命令,则新变量将成为浮点数。 如果您在会话的早期键入了set type double,则新的数字变量将变为 double。

方法和公式

您可以使用生成替换可以执行的任何操作。 命令之间的唯一区别是 replace 要求变量已经存在,而 generate 要求变量是 new 。 事实上,在 Stata 内部,生成和替换具有相同的代码。 由于 Stata 是一个交互式系统,我们强制区分替换现有值和生成新的,以便您在认为自己正在创建新信息时不会意外地替换有价值的数据。

上一篇下一篇

猜你喜欢

热点阅读