问题描述
├───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
所有文件都具有相同的结构。我想遍历它们并从选定数量的列中提取数据。文件名也都具有相同的结构。所有文件都有:
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,"(.*)",full.names = T)
# print(listcsv)
ldf_new<-fread(listcsv[i],"PB020"))
}
这里发生的事情是我只得到变量 ldf_new
中最后一次迭代的结果(即本例中的 UK)。有什么办法可以得到SK和UK的结果。
非常感谢!
解决方法
更改循环的最后一行以便将新元素添加到列表中应该可以解决问题:
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")))
}