使用虚拟变量生成变量的方法&在Stata的foreach

时间:2014-02-22 01:13:21

标签: foreach stata

我的数据集包含两个主要变量XY

  • 变量X表示具有不同品牌的多个计算机商品的不同代码(例如001X01,001X02等)。
  • 变量Y表示商店中每个变量代码X(例如15 = 15%,001X01)的税费。

我使用虚拟变量为这些计算机项目创建了类别(例如,{1}}虚拟变量用于硬盘驱动器,当变量HD表示HD时取值为1等)。我有一个包含40多个变量的列表(其中两个代表XX,其余的是我为计算机项创建的不同类别的一组虚拟变量。

我想在Stata中使用循环显示所有这些类别的平均值,但我不确定如何执行此操作。

例如代码:

Y

给出了代表硬盘的类别的平均税。如何在Stata中使用循环自动显示每个类别收取的所有平均税?我会手工完成没有问题,但我想重复这个过程多年,所以我想每年使用一个循环来提出这个输出。

我的目标是创建一个单独的Excel文件,其中包含我创建的每个计算机类别(共38个)以及每年按类别划分的平均税。

2 个答案:

答案 0 :(得分:2)

为什么要打扰循环并创建指标变量?如果我理解正确,您的初始数据集允许使用简单的collapse

clear all
set more off

input ///
code tax str10 categ
1 0.15 "hd"
2 0.25 "pend"
3 0.23 "mouse"
4 0.29 "pend"
5 0.16 "pend"
6 0.50 "hd"
7 0.54 "monitor"
8 0.22 "monitor"
9 0.21 "mouse"
10 0.76 "mouse"
end

list

collapse (mean) tax, by(categ)

list

要转到Excel,您可以尝试export excelput excel

运行help collapsehelp export了解详情。


修改

因为你坚持,下面是一个使用循环给出相同结果的例子。 我假设与以前相同的数据input。一些测试使用此示例数据库 使用expand 1000000表示速度几乎相同。但几乎肯定是, 你(包括你的你未来)和你的读者会更喜欢collapse。 它更清晰,更清晰,更简洁。它甚至更漂亮。

levelsof categ, local(parts)
gen mtax = .

quietly {
    foreach part of local parts {
        summarize tax if categ == "`part'", meanonly
        replace mtax = r(mean) if categ == "`part'"
    }
}

bysort categ: keep if _n == 1
keep categ mtax

Stata的功能使其与其他语言完全不同。一旦您 开始掌握它,你会发现许多事情在其他地方循环完成, 可以在Stata中制作无环路。在许多情况下,后一种风格将是首选。

使用help <command>查看相应的帮助文件,如果您不熟悉已保存的结果(例如r(mean)),请键入help return

答案 1 :(得分:1)

Roberto的优秀答案的补充:在collapse之后, 需要一个循环才能将结果导出为ex​​cel。

levelsof categ, local(levels)
foreach x of local levels {
export  excel  `x', replace
}

我更喜欢将数字代码用于变量,例如类别变量。然后我为它们分配值标签。这是罗伯托的代码的一个版本,它执行此操作,为了更接近您的问题,添加“年”变量

input code tax  categ year
1 0.15  1 1999
2 0.25  2 2000
3 0.23  3 2013
4 0.29  1 2010
5 0.16  2 2000
6 0.50  1 2011
7 0.54  4 2000
8 0.22  4 2003
9 0.21  3 2004
10 0.76 3 2005
end

#delim ;
label define catl
1 hd
2 pend
3 mouse
4 monitor
;
#delim cr
label values categ catl
collapse (mean) tax, by(categ year)

levelsof categ, local(levels)
foreach x of local levels {
export  excel  `:label (categ) `x'', replace
}

#delim ;命令可以在单独的行中轻松列出每个代码。 export语句中的“label”函数是一个扩展宏函数,用于在文件名中插入值标签。