Stata 按百分比和原始数字分组

Stata 按百分比和原始数字分组,stata,Stata,我的数据集如下所示: 我想创建一个表,按区域分组,并显示该区域的总金额占总金额的百分比和原始数字,以及每个区域记录/观察总数的百分比和记录/观察总数作为原始数字 下面的代码用于生成原始数字表,但不显示总数的百分比: tabstat amount, by(county) stat(sum count) 做你想做的事没有固定的命令。您必须自己对表格进行编程 下面是一个使用auto.dta的快速示例: . sysuse auto, clear (1978 Automobile Data) .

我的数据集如下所示:

我想创建一个表,按区域分组,并显示该区域的总金额占总金额的百分比和原始数字,以及每个区域记录/观察总数的百分比和记录/观察总数作为原始数字

下面的代码用于生成原始数字表,但不显示总数的百分比:

tabstat amount, by(county) stat(sum count) 

做你想做的事没有固定的命令。您必须自己对表格进行编程

下面是一个使用
auto.dta
的快速示例:

. sysuse auto, clear
(1978 Automobile Data)

. tabstat price, by(foreign) stat(sum count)

Summary for variables: price
     by categories of: foreign (Car type)

 foreign |       sum         N
---------+--------------------
Domestic |    315766        52
 Foreign |    140463        22
---------+--------------------
   Total |    456229        74
------------------------------
您可以进行计算并将原始数字保存在变量中,如下所示:

. generate total_obs = _N

. display total_obs
74

. count if foreign == 0
  52

. generate total_domestic_obs = r(N)

. count if foreign == 1
  22

. generate total_foreign_obs = r(N)

. egen total_domestic_price = total(price) if foreign == 0 

. sort total_domestic_price
. local tdp = total_domestic_price

. display total_domestic_price
315766

. egen total_foreign_price = total(price)  if foreign == 1

. sort total_foreign_price
. local tfp = total_foreign_price

. display total_foreign_price
140463

. generate total_price = `tdp' + `tfp' 

. display total_price
456229
至于百分比:

. generate pct_domestic_price = (`tdp' / total_price) * 100

. display pct_domestic_price
69.212173

. generate pct_foreign_price = (`tfp' / total_price) * 100 

. display pct_foreign_price 
30.787828
编辑:

这里有一种更自动化的方法来执行上述操作,而无需指定单个值:

program define foo

syntax varlist(min=1 max=1), by(string)

generate total_obs = _N
display total_obs

quietly levelsof `by', local(nlevels)

foreach x of local nlevels {
    count if `by' == `x'
    quietly generate total_`by'`x'_obs = r(N)

    quietly egen total_`by'`x'_`varlist' = total(`varlist') if `by' == `x' 
    sort total_`by'`x'_`varlist'
    local tvar`x' = total_`by'`x'_`varlist'
    local tvarall `tvarall' `tvar`x'' +
    display total_`by'`x'_`varlist'
}

quietly generate total_`varlist' = `tvarall' 0 
display total_`varlist'

foreach x of local nlevels {
    quietly generate pct_`by'`x'_`varlist' = (`tvar`x'' / total_`varlist') * 100
    display pct_`by'`x'_`varlist'
}

end
结果是一致的:

. foo price, by(foreign)
74
  52
315766
  22
140463
456229
69.212173
30.787828

显然,您需要将结果格式化为您喜欢的表格。

这里是另一种方法。我偷了@Pearly Spencer的例子。它可以概括为一个命令。我想传达的主要信息是,
list
对于制表和其他报告很有用,通常只是有义务计算您希望事先显示的内容

. sysuse auto, clear
(1978 Automobile Data)

. preserve 

. collapse (sum) total=price (count) obs=price, by(foreign)

. egen pc2 = pc(total)

. egen pc1 = pc(obs)

. char pc2[varname]  "%"

. char pc1[varname]  "%"

. format pc* %2.1f 

. list foreign obs pc1 total pc2 , subvarname noobs sum(obs pc1 total pc2) 

      +-----------------------------------------+
      |  foreign   obs       %    total       % |
      |-----------------------------------------|
      | Domestic    52    70.3   315766    69.2 |
      |  Foreign    22    29.7   140463    30.8 |
      |-----------------------------------------|
  Sum |             74   100.0   456229   100.0 |
      +-----------------------------------------+


. restore 
egen
中编辑一篇文章,风格相似,但保留原始数据,新变量也可用于导出或图形

. sysuse auto, clear
(1978 Automobile Data)

. egen total = sum(price), by(foreign) 

. egen obs = count(price), by(total) 

. egen tag = tag(foreign) 

. egen pc2 = pc(total) if tag
(72 missing values generated)

. egen pc1 = pc(obs) if tag 
(72 missing values generated)

. char pc2[varname]  "%"

. char pc1[varname]  "%"

. format pc* %2.1f 

. list foreign obs pc1 total pc2 if tag, subvarname noobs sum(obs pc1 total pc2) 

      +-----------------------------------------+
      |  foreign   obs       %    total       % |
      |-----------------------------------------|
      | Domestic    52    70.3   315766    69.2 |
      |  Foreign    22    29.7   140463    30.8 |
      |-----------------------------------------|
  Sum |             74   100.0   456229   100.0 |
      +-----------------------------------------+

请阅读并向我们提供using Stata的
dataex
命令。图片对我们提供答案没有帮助。谢谢你的建议,但这个例子与我要找的有点不同,我不想指定不同的面积值。你想要什么和你能从Stata的盒子里得到什么是两件完全不同的事情。正如我在回答中所说的,只有通过创建一个自定义程序来实现所有这些,并且可以在一行中调用它,才能得到您想要的。将结果格式化成您喜欢的表格,还需要编程。@AshleyBrown请参阅我的编辑以获取此类程序的示例。当然,这还可以进一步改进。
collapse
是此类计算中首先想到的东西,但我一直不喜欢它破坏当前数据集。我同意
列表
非常方便,但是如果表格有点复杂,您需要自己创建它。作为建议,您可能希望编辑您的答案,以包含
保存
/
合并
,以便生成的数据包含在主数据集中。生成精简的数据集是
折叠
的主要目的,因此您可以这样做:我的代码故意包含
保留
恢复
作为提示。我很高兴地向OP推荐你的建议:毕竟,这是一个专业和热情程序员的论坛。@PearlySpiner我想到了另一种避免
崩溃的方法。