我在一个公共文件夹中有多个(~80).csv,我需要对某些列进行子集化,并将子集编辑的新表写入新的.csv。我有一个脚本,我可以用它一次做一个:
setwd("C:/Data/HAAS")
### ENTER COUNTY NAME
county.name <- "charlotte"
####ENTER UNZIPPED CSV DOWNLOADED FROM ftp://sdrftp03.dor.state.fl.us/Tax%20Roll%20Data%20Files/2016%20Final%20NAL%20-%20SDF%20Files/
cnty.raw<- read.csv("C:/Data/HAAS/tax_roll_data/NAL18F201601.csv")
cnty.clean <- "" ## CREATE NEW EMPTY DATAFRAME
cnty.clean$CNTY_ID <- cnty.raw$CO_NO ## ADD COUNTY ID TO CLEAN FILE
cnty.clean$PARCEL_ID <- cnty.raw$PARCEL_ID ## ADD PARCEL ID TO CLEAN FILE
cnty.clean$ACT_BUILT <- cnty.raw$ACT_YR_BLT ## ADD ACTUAL YEAR BUILT TO CLEAN FILE
cnty.clean$FLUCCS <- cnty.raw$DOR_UC ## ADD LAND USE COLUMN
cnty.clean$HMSTD_VAL <- cnty.raw$AV_HMSTD ## USED TO DETERMINE IF PARCEL CONTAINS A HOMESTEAD
cnty.clean <- cnty.clean[cnty.clean$FLUCCS == 001, ] ## SELECT ONLY SINGLE-FAMILY RESIDENTIAL PROPERTIES
cnty.clean <- na.omit(cnty.clean) ## REMOVE NA VALUES
head(cnty.clean)
#### BEGIN WRITING CLEANED TABLES TO OUTPUT FOLDERS ##################################
setwd("C:/Data/HAAS/R_output/csv") ## CSV DESTINATION FOLDER
write.csv(cnty.clean, file = paste(county.name, ".csv", sep = "")) ## WRITE CSV TO FOLDER
setwd("C:/Data/HAAS/R_output/dbf") ## DBF DESTINATION FOLDER
library(foreign)
write.dbf(cnty.clean, file = paste(county.name, ".dbf", sep = "")) ## WRITE AS .DBF FOR SHAPEFILE MERGE
#### RESET WORKING DIRECTORY BACK TO ORIGINAL PATH
setwd("C:/Data/HAAS")
head(cnty.clean)
summary(cnty.clean)
问题是,每次我想通过所有csv运行代码时,我必须手动更改csv文件名和县名字段。
我已经使用r来完成简单的任务,但在使用循环自动化流程方面我很业余。有没有办法我可以将这个代码插入到循环中,一遍又一遍地运行在文件路径文件夹中的所有csv?
注意:我在其他帖子中搜索并尝试了不同的选项,但似乎没有一个适用于我的情况。
答案 0 :(得分:3)
您可以使用list.files
获取所有文件名。选项full.names = TRUE
为您提供文件名的完整路径,而不是关系。这是一个应该可扩展的简单示例。
dfiles <- list.files(directory, full.names = TRUE)
county.names <- #vector of counties
for(j in 1:length(county.names)){
for (i in 1:length(dfiles)){
#operations go here
write.csv(cnty.clean, file = paste(county.names[j], ".csv", sep = "")))
}
}
答案 1 :(得分:1)
假设您的所有csv文件都具有相同的列名,您可以这样做:
library(foreign)
setwd("C:/Data/HAAS")
my_func <- function(path, county.name){
cnty.raw <- read.csv(path)
cnty.clean <- data.frame()
cnty.clean$CNTY_ID <- cnty.raw$CO_NO ## ADD COUNTY ID TO CLEAN FILE
cnty.clean$PARCEL_ID <- cnty.raw$PARCEL_ID ## ADD PARCEL ID TO CLEAN FILE
cnty.clean$ACT_BUILT <- cnty.raw$ACT_YR_BLT ## ADD ACTUAL YEAR BUILT TO CLEAN FILE
cnty.clean$FLUCCS <- cnty.raw$DOR_UC ## ADD LAND USE COLUMN
cnty.clean$HMSTD_VAL <- cnty.raw$AV_HMSTD ## USED TO DETERMINE IF PARCEL CONTAINS A HOMESTEAD
cnty.clean <- cnty.clean[cnty.clean$FLUCCS == 001, ] ## SELECT ONLY SINGLE-FAMILY RESIDENTIAL PROPERTIES
cnty.clean <- na.omit(cnty.clean) ## REMOVE NA VALUES
write.csv(cnty.clean, file = paste("R_output/csv/", county.name, ".csv", sep = ""))
write.csv(cnty.clean, file = paste("R_output/dbf/", county.name, ".csv", sep = ""))
}
list_path <- c("tax_roll_data/NAL18F201601.csv", "path/to/second/file.csv")
list_county <- c("charlotte", "second county")
mapply(my_func, path = list_path, county.name = list_county)
注意:这会将您的文件路径更改为相对路径,因此您可以忽略路径列表中的"C:/Data/HAAS/"
部分。
您可以使用其他答案中描述的list.files
函数来构建路径列表,但此解决方案的运行速度应比for循环快得多。但是,这确实假设您拥有相同数量的县名和路径。否则,它将重用两个列表中较短者的值,并为您提供意外(和不需要的)结果
答案 2 :(得分:0)
你可以使用
f <- list.files('C:/Data/HAAS/tax_roll_data', pattern='.csv')
将文件夹C:/ Data / HAAS / tax_roll_data中的文件放入向量中。然后循环遍历f
,类似于:
for (i in 1:length(f)){
cnty.raw <- read.csv(f[i])
#Rest of your script
}