通过遍历文件夹更改标识符——R
Change identifier by looping through folders -- R
我有一个与循环相关的问题。我有以下文件夹结构(摘录):
├───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
所有文件都具有相同的结构。我想遍历它们并从 select 列中提取数据。文件名也都具有相同的结构。所有文件都有:
- 确定的唯一国家(例如上面示例中的英国、SK)
- 独特的数据库类型(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 的结果吗?
非常感谢!
更改循环的最后一行以便将新元素添加到列表中应该可以解决问题:
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")))
}
我有一个与循环相关的问题。我有以下文件夹结构(摘录):
├───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
所有文件都具有相同的结构。我想遍历它们并从 select 列中提取数据。文件名也都具有相同的结构。所有文件都有:
- 确定的唯一国家(例如上面示例中的英国、SK)
- 独特的数据库类型(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 的结果吗?
非常感谢!
更改循环的最后一行以便将新元素添加到列表中应该可以解决问题:
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")))
}