Как я могу импортировать определенные файлы? - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь 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.

Как определить максимальное значение в локальном макросе или есть более простой способ получить то, что я хочу?

Ответы [ 3 ]

3 голосов
/ 06 ноября 2019

Поскольку вы циклически повторяете годы от первого возможного до последнего возможного, все, что вам нужно, это отслеживать последний действительный год:

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 - более точное решение в этом случае,

2 голосов
/ 06 ноября 2019

Могу ли я позаимствовать код Ника?

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 цикла и перейти к следующему округу.

1 голос
/ 06 ноября 2019

Следующее работает для меня и более эффективно:

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'"
}

Этот подход будет полезен, если у вас есть большое количество файлов, имена которых не могут вписаться в локальный макрос.

...