Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在Stata中创建临时数据集_R_Stata - Fatal编程技术网

R 在Stata中创建临时数据集

R 在Stata中创建临时数据集,r,stata,R,Stata,我正在浏览大量Stata文档,但仍然很难找到一些基本任务的简单示例 一个特别难以理解的问题是如何将某些操作的结果存储在变量中(在编程意义上,不是字段/列),以便我可以将它们相互比较。我不是在谈论统计模型,我可能会使用类似于估计值的东西 下面是一个来自R世界的示例,其中我将两个字段的组的平均值存储在相同数量的变量中(同样,在编程意义上): 库(dplyr) category我不是Stata方面的专家(我主要从事python工作,涉猎R),但这段代码应该可以工作collapse类似于R中的group

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

一个特别难以理解的问题是如何将某些操作的结果存储在变量中(在编程意义上,不是字段/列),以便我可以将它们相互比较。我不是在谈论统计模型,我可能会使用类似于
估计值的东西

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

库(dplyr)

category我不是Stata方面的专家(我主要从事python工作,涉猎R),但这段代码应该可以工作collapse
类似于R中的
groupby
。在折叠数据后,我生成差异变量,然后仅将该变量保留在数据帧中。最后,我将文件保存为temp(并替换cd中名为temp.dta的任何其他文件)


只需一行就可以将结果放入变量(Stata sense)。不重复地显示它也相当容易@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。在Stata中有几种方法可以做到这一点,就像在R中一样


至于文档,从[U]开始阅读手册是不可替代的。你可以在谷歌上浪费很多时间,因为互联网上有很多非常有限或零碎的教程。他们大多支持作者的意图,但只有通过系统阅读才能更全面地理解

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

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)
这就是
egen
在引擎盖下与其相关的
mean()
功能所做的。“手动”执行此操作的优点是,您可以将
round()
abs()
函数组合在一起进行取整,并在一个步骤中分别获取差值的绝对值

然后,您可以显示结果:

bysort category: list difference if _n == _N

-> category = a

     +------------+
     | difference |
     |------------|
  3. |        .67 |
     +------------+

-> category = b

     +------------+
     | difference |
     |------------|
  3. |      14.67 |
     +------------+

-> category = c

     +------------+
     | difference |
     |------------|
  3. |     104.67 |
     +------------+
也可以将它们保存在变量中:

bysort category: generate results = difference if _n == _N

这很有帮助,但四舍五入到小数的倍数并不是一种特别好的近似显示格式的方法。现在在中直接讨论了这一点,但这是因为大多数十进制分数(0.1、0.01、0.001等的倍数)不能精确地用二进制表示。我同意,但根据用例的不同,它通常是一个非常合适的近似值。我对文档并不陌生。在我看来,数百页的命令只是拼图的一部分,但肯定不应该被视为完整的。根据我的阅读,Stata手册缺乏任何形式的流程,并且无法提供上下文,这使得“天真”的人通常无法访问它们。奇怪的是,这就是我对R文档的印象。“官方”Stata文件约10000页;这是一种很难知道哪100。。。200 ... 500 ... 每个人最需要的1000页以及顺序。Muenchen和Hilbe为Stata用户写了一本关于R的书。相反的那本书更难想象,当然也不在我的待办事项清单上,尽管我已经尽力解释了其中的一些细节。本质上,Stata不是一种编程语言,而是一种可编程的统计程序,任何想要其他东西的人最多都会感到困惑。Mata更像是主流编程语言(尽管在编程中,主流总是奇怪地出现在观察者的位置)。我不同意。Stata的
ado
语言是一种编程语言。但这不是一个一般的统计数据。它本质上不是面向对象的,这并不意味着它不是一种编程语言
Mata本质上是面向对象的,但它是一种矩阵语言,不是一种通用的编程语言。@Pearly Spencer相同的信息,不同的边界。我发现人们总能想出一些标准,使Stata不是一种编程语言。它总是有更好的语言来表达的。
bysort category: list difference if _n == _N

-> category = a

     +------------+
     | difference |
     |------------|
  3. |        .67 |
     +------------+

-> category = b

     +------------+
     | difference |
     |------------|
  3. |      14.67 |
     +------------+

-> category = c

     +------------+
     | difference |
     |------------|
  3. |     104.67 |
     +------------+
bysort category: generate results = difference if _n == _N