2017-03-17 61 views
0

我在一個公用文件夾中有多個(〜80).csv,我需要對某些列進行子集劃分,並將子集化的新表寫入新的.csv格式。我有一個劇本,我可以用做他們一次一個:使用循環讀取,清理和寫入r中的多個.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) 

的問題是,我必須manualy更改csv文件的名稱,也是縣名現場手動,每次我想運行的代碼通過所有的csv的。

我已經使用r來完成簡單的任務,但是當它使用循環自動化進程時,我是一個業餘愛好者。有沒有一種方法可以將此代碼插入到循環中,以便通過文件路徑文件夾中的所有csv重複運行?

注意:我搜索了四處,並嘗試了其他帖子中的不同選項,但沒有一個適用於我的情況。

+0

查看'list.files'函數。這將列出指定目錄中的所有文件。您可以將結果分配給一個變量,然後循環該變量。 –

回答

2

您可以使用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 = ""))) 
    } 
} 
+0

這不能解決縣名問題。 OP將需要一個包含文件和相關縣名的表格。 –

+0

@Bishops_Guest你是對的,你可以用一個嵌套循環一次完成,但它不會在計算上有效。我編輯了答案來展示這個概念。 –

+2

或者有一個鏈接csv文件名與縣名的查找表。 – user3375672

0

您可以使用 f <- list.files('C:/Data/HAAS/tax_roll_data', pattern='.csv')來獲取文件在文件夾C:/數據/ HAAS/tax_roll_data到載體中。然後遍歷f,是這樣的:

for (i in 1:length(f)){ 
cnty.raw <- read.csv(f[i]) 

#Rest of your script 
} 
0

假設所有的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循環快得多。但是,這確實假定您有相同數量的縣名和路徑。否則,它將重用兩個列表中較短的值,並給出您意想不到的(和不需要的)結果