Изменение идентификатора путем перебора папок — R

#r #loops #directory-structure #fread

#r #циклы #структура каталогов #fread

Вопрос:

У меня есть вопрос, связанный с циклом. У меня следующая структура папок (выдержка):

 ├───Y2017
    │       UDB_cSK17D.csv
    │       UDB_cSK17H.csv
    │       UDB_cSK17P.csv
    │       UDB_cSK17R.csv
    │       UDB_cUK17D.csv
    │       UDB_cUK17H.csv
    │       UDB_cUK17P.csv
    │       UDB_cUK17R.csv            
└───Y2018
    │       UDB_cSK18D.csv
    │       UDB_cSK18H.csv
    │       UDB_cSK18P.csv
    │       UDB_cSK18R.csv
    │       UDB_cUK18D.csv
    │       UDB_cUK18H.csv
    │       UDB_cUK18P.csv
    │       UDB_cUK18R.csv
 

Все файлы имеют одинаковую структуру. Я хотел бы перебирать их и извлекать данные из определенного количества столбцов. Имена файлов также имеют одинаковую структуру. Все файлы имеют:

  1. идентифицирована уникальная страна (например, Великобритания, Южная Корея в приведенных выше примерах)
  2. уникальный тип базы данных (D, H, P … — последний символ в имени файла)

Я хотел бы создать цикл, который перебирает имена файлов. Для одной страны это будет работать следующим образом:

     library(data.table)

    ldf<-list()

    country_id<-"UK(.*)"
    db_id<-"P.csv$"

    listcsv<-dir(pattern = paste0(country_id,db_id), recursive = T, full.names = T)
    
    for (k in 1:length(listcsv)){
        ldf[[k]]<-fread(listcsv[k],select = c("PB010","PB020"))
        }
    
    uk_data<-bind_rows(as.data.frame(do.call(rbind,ldf[])))
 

Этот код извлекает все нужные мне столбцы на основе идентификатора страны, который я ему даю (Великобритания в этом примере). Поскольку в моем наборе данных много стран, я хотел бы иметь код, который повторяет и обновляет идентификатор страны. Я попробовал следующее:

 ldf_new<-list()
countries <-c("SK", "UK")
for (i in 1:length(countries)) {
  currcty1 <- countries[i]
  
  listcsv<-dir(pattern = paste0(currcty1,"(.*)",db_id), recursive = T, full.names = T)
  # print(listcsv)
  ldf_new<-fread(listcsv[i],select = c("PB010","PB020"))
}
 

Здесь происходит то, что я получаю только результаты последней итерации в переменной ldf_new (т. Е. В данном случае UK). Могу ли я каким-либо образом получить результаты для SK и UK.

Заранее большое спасибо!

Ответ №1:

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

 ldf_new<-list()
countries <-c("SK", "UK")
for (i in 1:length(countries)) {
  currcty1 <- countries[i]
  
  listcsv<-dir(pattern = paste0(currcty1,"(.*)",db_id), recursive = T, full.names = T)
  # print(listcsv)
  ldf_new<-c(ldf_new, fread(listcsv[i],select = c("PB010","PB020")))
}