原始问题
在工作中导入大型数据集时,我注意到在使用该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 复制和粘贴的,但有三处小改动:
- 我在开始时保存了一个空数据集
- 我注释掉逻辑
if
语句 - 我
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
。