#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
Все файлы имеют одинаковую структуру. Я хотел бы перебирать их и извлекать данные из определенного количества столбцов. Имена файлов также имеют одинаковую структуру. Все файлы имеют:
- идентифицирована уникальная страна (например, Великобритания, Южная Корея в приведенных выше примерах)
- уникальный тип базы данных (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")))
}