在Stata中创建临时数据集

时间:2018-09-28 01:57:30

标签: r stata

我正在浏览许多Stata文档,但仍然很难找到一些基本任务的简单示例。

一个特别难以理解的项目是如何将某些操作的结果存储在变量中(从编程的角度,而不是字段/列),以便我可以将它们相互比较。我并不是在谈论统计模型,我可能会使用诸如estimates之类的东西。

这是R世界的一个示例,其中我将两个字段的组的平均值存储在相同数量的变量中(同样,在编程意义上):

library(dplyr)

category <- c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c')
first <- c(2, 1, 5, 3, 4, 2, 1, 3, 3) 
second <- c(3, 1, 6, 9, 12, 32, 113, 85, 123) 
df <- data.frame(category, first, second)

firstMean <- df %>% group_by(category) %>% summarise(mean = 
mean(first))
secondMean <- df %>% group_by(category) %>% summarise(mean = 
mean(second))

abs(firstMean[,2] - secondMean[,2])

# Results
# a 0.67
# b 14.67
# c 104.67

问题:

  1. 如何在Stata中完成相同的任务?

我也正在阅读return list,但是当我计算平均值后使用save命令时,似乎覆盖了先前运行的命令。

  1. 我可以通过某种方式临时命名吗?

我不想将这些内容保存在文件中,我只是想制作快速的临时数据帧。

3 个答案:

答案 0 :(得分:1)

我不是Stata专家(我主要在python中工作,在R中涉猎),但是这段代码应该可以工作。 stata中的collapse与R中的group_by相似。折叠数据后,我生成了差分变量,然后仅将该变量保留在我的数据框中。最后,我将文件另存为temp(并替换CD中其他名为temp.dta的文件)。

use df.dta, clear
collapse (mean) first second, by(category)
gen diff = abs(first-second)
keep diff
save temp, replace

答案 1 :(得分:1)

您可以将结果放入仅一行的变量中(Stata意义)。不重复显示它也很容易。 @Joe Patten的答案很有帮助,但是会破坏当前数据集。

clear 
input str1 category first second 
a  2  3
a  1  1
a  5  6
b  3  9 
b  4  12
b  2  32
c  1  113
c  3  85
c  3  123
end 

egen difference = mean(first-second), by(category) 
egen tag = tag(category) 

list category difference if tag , noobs 

tabdisp category, c(difference) format(%4.2f) 

以下是结果:

. list category difference if tag , noobs 

  +----------------------+
  | category   differe~e |
  |----------------------|
  |        a   -.6666667 |
  |        b   -14.66667 |
  |        c   -104.6667 |
  +----------------------+

. tabdisp category, c(difference) format(%4.2f) 

----------------------
 category | difference
----------+-----------
        a |      -0.67
        b |     -14.67
        c |    -104.67
----------------------

您要达到的目标可能会大不相同,例如使用局部宏或标量或使用Mata。就像在R中一样,在Stata中有多种实现方法。

对于文档,从[U]开始,没有真正的替代品可以阅读手册。您可能会浪费大量时间在Google上搜索,因为互联网上有很多非常有限或零碎的教程。大多数情况下,它们支持作者的意图,但是只有通过系统的阅读,才能获得更全面的理解。

答案 2 :(得分:1)

下面是@NickCox解决方案的补充答案,这是最干净的:

display: flex;   
flex-wrap: wrap;

这是<link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.min.css" rel="stylesheet" /> <div class='columns is-multiline'> <div class='column is-4'> <div class="card"> <div class="card-image"> <div class="card-image"> colonne </div> </div> <div class="card-content"> </div> </div> </div> <div class='column is-4'> <div class="card"> <div class="card-image"> colonne 2 </div> <div class="card-content"> </div> </div> </div> </div>与其关联的clear input str1 category first second a 2 3 a 1 1 a 5 6 b 3 9 b 4 12 b 2 32 c 1 113 c 3 85 c 3 123 end bysort category: generate difference = round(abs(sum(first / _N) - sum(second / _N)), .01) 功能的共同作用。 “手动”执行此操作的好处是,您可以结合使用egenmean()函数来取整并分别取差的绝对值。

然后您可以显示结果:

round()

或者您可以将它们保存在变量中:

abs()