使用循环来读取,清理和写入r中的多个.csv

时间:2017-03-17 17:13:29

标签: r loops

我在一个公共文件夹中有多个(~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?

注意:我在其他帖子中搜索并尝试了不同的选项,但似乎没有一个适用于我的情况。

3 个答案:

答案 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
}