我正在尝试import
数百个美国县xls
文件,以形成Stata中的完整数据集。问题在于,对于每个县,我都有不同年份的多个文件,因此我的文件名列表如下所示:
county1-year1970.xls
county1-year1975.xls
county2-year1960.xls
county2-year1990.xls
对于每个县,我只需要最近一年的文件(各县之间有所不同)。
到目前为止,我已经编写了代码来遍历每个可能的文件名,如果文件存在,则将年份存储在本地宏maxyear
中:
local years = 0
forvalues i = 1/500 {
forvalues yr = 1900/2018 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 {
local years `years' `yr'
}
}
/* [code to extract the max value in `years'] */
import excel county`i'-year`maxyear'.xls, clear
}
该循环似乎有效,但是仍然缺少从本地列表“ years”中提取最大值的代码。我想使用该最大值导入Excel工作表。
如何在本地宏中标识最大值,或者有更简单的方法来获取我想要的?
答案 0 :(得分:3)
当您从第一个可能的年份到最后一个可能的年份不断循环时,您所需要的只是跟踪上一个有效年份:
forval i = 1/500 {
local maxyear
forval yr = 1900/2018 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 local maxyear `yr'
}
if "`maxyear'" != "" {
import excel county`i'-year`maxyear'.xls, clear
}
}
否则,保留所有有效年份的记录,然后查找这些年份的最大值,这比您需要做的工作还要多。 (但是请注意,当您循环访问越来越多的年份时,最大值将只是列表中的最后一项。)
这个答案很接近问题,但是在这种情况下,@ Pearly Spencer的答案是一个更整洁的解决方案。
答案 1 :(得分:2)
以下内容对我有用,效率更高:
forvalues i = 1 / 2 {
local files `: dir . files "county`i'*"'
display "`: word `: word count `files'' of `files''"
}
county1-year1975.xls
county2-year1990.xls
我在这里使用display
命令进行说明,但是您也可以使用import
。
这里的想法是,如果您知道以county
前缀(county1
,county2
等开头的文件数),则可以获取以下文件中每个前缀的文件名使用宏扩展功能dir
的本地宏。然后,您只需计算那里的单词数即可得到最后一个。
请注意,在这种情况下,本地宏将按字母顺序排序。但是,更一般而言,您可以使用宏扩展功能list sort
对宏中的项目进行排序。
例如:
local files : list sort files
以下使用mata
来规避Stata本地宏中的最大字符限制:
forvalues i = 1 / 2 {
mata: fl = sort(dir(".", "files", "county`i'*"), 1); st_local("file", fl[rows(fl)])
display "`file'"
}
如果您有大量文件,而文件名不能全部放在本地宏中,则此方法将很有用。
答案 2 :(得分:2)
我可以借用尼克的密码吗?
forval i = 1/500 {
foreach yr of numlist 2018(-1)1900 {
capture confirm file county`i'-year`yr'.xls
if _rc == 0 {
import excel county`i'-year`yr'.xls, clear
continue, break
}
}
}
请告诉我这是否无效,因为我无法自己进行测试。但是,我的逻辑是从yr
中最大的数字开始,为county
找到第一个数字,然后在break
循环中移动到下一个县。