0

原始问题

在工作中导入大型数据集时,我注意到在使用该append命令时 Stata 似乎“忘记”了本地宏的一些意外行为。

这似乎更加奇怪,因为它似乎是这个命令特有的一种现象(我测试过save并且代码按预期工作)。

*****************
** SET UP
******************
local datasets "auto.dta auto2.dta"
global data "/Users/Seansmac/Desktop/stata_question"
save "$data/test_data.dta", replace emptyok
local datasets "auto.dta auto2.dta"


** Save Stata data in two Excel sheets. This replicates the status of my raw data at work.
foreach dataset in `datasets'{


    di "`dataset' loaded"
     sysuse `dataset', clear
     gen data_name = "`dataset'"
     tab data_name
     export excel using "$data/auto_excel.xlsx", sheet("`dataset'") first(variables) sheetreplace
     di "`dataset' saved in excel"
     } 

*****************
** Demo of Problem
******************

import excel "$data/auto_excel.xlsx", desc

local worksheets `r(N_worksheet)'
di `worksheets'

  forvalues i = 1/`worksheets' { 
    di " Sheet number  `i'"


     local shtname`i' `r(worksheet_`i')'
     di "loading database: `shtname`i''"

     import excel "$data/auto_excel.xlsx", sheet("`shtname`i''")  clear firstrow

          di "database: `shtname`i'' loaded"

      append using "$data/test_data.dta", force

      di "database: `shtname`i'' appended"        
}


***** Show only the same data  was appended twice
     use "$data/test_data.dta", clear
     tab data_name

** I include this tab to demonstrate that only one of the two data sets is appended. 

*****************
** END
*****************

抱歉,如果示例有点混乱,但我经常发现display在与当地人合作时使用它很有帮助。要运行代码,只需更改全局数据。

为了忠实于我在工作中遇到的问题,我包括了该import excel部分;我对这个问题的理解不足以使这个例子变得更小。

原始问题已编辑

下面是两个代码块。第一个表明该append命令似乎可以按我的预期工作(我注意到我忘记save在我原来的问题中使用)。这个块表明,虽然附加一个带有空数据集的数据集可能并不完全直观,但它仍然可以正常工作。这种方法的优点是它消除了加载文件时对条件语句的需要。

在第二个代码块中,我尝试以append相同的基本方式使用该命令,但这次是在循环中。此代码块是从 Pearly Spencer 复制和粘贴的,但有三处小改动:

  1. 我在开始时保存了一个空数据集
  2. 我注释掉逻辑if语句
  3. append用空数据集代替(然后save是它,所以第二轮它不应该是空的)。

Stata“忘记”的本地宏是shtname. 如果您检查display语句,则在第一个循环之后不会打印任何内容。这是我的问题的位置。为了进一步证明这一点,tab脚本末尾的命令显示该变量data_name有 148 个观测值,auto.dta而没有一个观测值auto2.dta。这表明相同(即第一个)数据集被附加了两次。这表明(对我而言)append脚本的部分工作正常,但本地 marco 存在问题,shtname.

* DEMONSTRATE APPEND 似乎可以工作 *

clear all
cd "[**INSERT CD**]"

*Create empty data set to append later
save "test_data_noloop.dta", replace emptyok

* load first dataset
sysuse auto.dta, clear
* Gen a variable indicating what dataset it is
gen dataset = "auto_1"
* append data with empty dataset
append using "test_data_noloop.dta"
save "test_data_noloop.dta", replace

clear
*load second dataset
sysuse auto2.dta, clear
* gen dataset variable again
gen dataset = "auto_2"
* append with the previously saved dataset
append using "test_data_noloop.dta"

* Demonstrate both datasets have been appended
tab dataset

* 跟随 PEARLY SPENCER,稍作调整 *

clear all
cd "[**INSERT CD**]"


local datasets "auto.dta auto2.dta"

** Added the following line
save "test_data.dta", replace emptyok 

foreach dataset in `datasets'{
    display "`dataset' loaded"
    sysuse `dataset', clear
    generate data_name = "`dataset'"
    tab data_name
    export excel using "auto_excel.xlsx", sheet("`dataset'") first(variables) sheetreplace
    display "`dataset' saved in excel"
} 


import excel "auto_excel.xlsx", desc

local worksheets `r(N_worksheet)'
display `worksheets'

forvalues i = 1 / `worksheets' { 
    display " Sheet number  `i'"
    local shtname`i' `r(worksheet_`i')'
    display "loading database: `shtname`i''"
    import excel "auto_excel.xlsx", sheet("`shtname`i''")  clear firstrow
    *if `i' == 1 save "test_data.dta", replace
    display "database: `shtname`i'' loaded"
    *if `i' > 1 {
        append using "test_data.dta", force
        save "test_data.dta", replace
    *}
    display "database: `shtname`i'' appended"        
}


use "test_data.dta", clear
tab data_name

为了解决评论中的一些注释,在控制台中键入时可以找到 auto2.dta sysuse dir。因此,它是一个可供所有人使用的数据集。我已尽最大努力保持我的代码可复制,除非我弄错了,否则我需要做的就是设置cd上述代码才能工作。

其次,我努力确保我没有犯愚蠢的逻辑错误(如上所述,我意识到我在原始问题中省略了保存文件,这确实意味着我每次都附加一个空数据集)。也就是说,可能是我已经研究这个问题太久了,我再也看不到树上的木头了;所以,如果它仍然是一个衬里类型的问题,请放轻松!

最后,我从未说过 Stata 忘记了本地宏,只是它似乎这样做了。因此,我问这个问题是为了了解发生了什么(或者更有可能是我犯了错误的地方)。

我的输出的屏幕截图 在没有显示本地人的地方看到红色标记。在此处输入图像描述

***编辑#3 这张图片似乎显示了(迄今为止)无法解释的行为源于append而不是import

在此处输入图像描述

4

1 回答 1

1

我的理解是您希望将连续的 Excel 工作表附加到一个 Stata 数据集中。

以下是您的玩具示例的工作版本。

设置:

clear all
local datasets "auto.dta auto2.dta"

将 Stata 数据保存在两个 Excel 工作表中:

foreach dataset in `datasets'{
    display "`dataset' loaded"
    sysuse `dataset', clear
    generate data_name = "`dataset'"
    tab data_name
    export excel using "auto_excel.xlsx", sheet("`dataset'") first(variables) sheetreplace
    display "`dataset' saved in excel"
} 

演示解决问题的方法:

import excel "auto_excel.xlsx", desc

local worksheets `r(N_worksheet)'
display `worksheets'

forvalues i = 1 / `worksheets' { 
    display " Sheet number  `i'"
    local shtname`i' `r(worksheet_`i')'
    display "loading database: `shtname`i''"
    import excel "auto_excel.xlsx", sheet("`shtname`i''")  clear firstrow
    if `i' == 1 save "test_data.dta", replace
    display "database: `shtname`i'' loaded"
    if `i' > 1 {
        append using "test_data.dta", force
        save "test_data.dta", replace
    }
    display "database: `shtname`i'' appended"        
}

显示结果:

use "test_data.dta", clear
tab data_name

(为了更好的易读性,我将代码分解为不同的片段。)


编辑:

Stata 一次use 只能有一个数据集。该append命令的工作方式是将来自指定外部数据集的数据“附加”到那些已经加载到内存中的数据(即used)。您的示例版本没有为您提供所需结果的原因是因为您每次导入 Excel 工作表后都尝试附加一个空数据集。这是逻辑上的错误。


编辑2:

生成的输出:

. clear all

. local datasets "auto.dta auto2.dta"

. 
. foreach dataset in `datasets'{
  2.     display "`dataset' loaded"
  3.     sysuse `dataset', clear
  4.     generate data_name = "`dataset'"
  5.     tab data_name
  6.     export excel using "auto_excel.xlsx", sheet("`dataset'") first(variables) sheetreplace
  7.     display "`dataset' saved in excel"
  8. } 
auto.dta loaded
(1978 Automobile Data)

  data_name |      Freq.     Percent        Cum.
------------+-----------------------------------
   auto.dta |         74      100.00      100.00
------------+-----------------------------------
      Total |         74      100.00
file auto_excel.xlsx saved
auto.dta saved in excel
auto2.dta loaded
(1978 Automobile Data)

  data_name |      Freq.     Percent        Cum.
------------+-----------------------------------
  auto2.dta |         74      100.00      100.00
------------+-----------------------------------
      Total |         74      100.00
file auto_excel.xlsx saved
auto2.dta saved in excel

. 
. import excel "auto_excel.xlsx", desc

      Sheet | Range
  ----------+----------
   auto.dta | A1:M75
  auto2.dta | A1:M75

. 
. local worksheets `r(N_worksheet)'

. display `worksheets'
2

. 
. forvalues i = 1 / `worksheets' { 
  2.     display " Sheet number  `i'"
  3.     local shtname`i' `r(worksheet_`i')'
  4.     display "loading database: `shtname`i''"
  5.     import excel "auto_excel.xlsx", sheet("`shtname`i''")  clear firstrow
  6.     if `i' == 1 save "test_data.dta", replace
  7.     display "database: `shtname`i'' loaded"
  8.     if `i' > 1 {
  9.         append using "test_data.dta", force
 10.         save "test_data.dta", replace
 11.     }
 12.     display "database: `shtname`i'' appended"        
 13. }
 Sheet number  1
loading database: auto.dta
file test_data.dta saved
database: auto.dta loaded
database: auto.dta appended
 Sheet number  2
loading database: auto2.dta
database: auto2.dta loaded
(note: variable rep78 was byte in the using data, but will be str9 now)
file test_data.dta saved
database: auto2.dta appended

. 
. use "test_data.dta", clear

. tab data_name

  data_name |      Freq.     Percent        Cum.
------------+-----------------------------------
   auto.dta |         74       50.00       50.00
  auto2.dta |         74       50.00      100.00
------------+-----------------------------------
      Total |        148      100.00

. 
end of do-file
于 2018-08-04T20:29:32.960 回答