2017-03-17 22 views
0

私は、複数の(〜80).csvファイルを共通のフォルダに置いて、特定の列をサブセット化し、 .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ファイル名とも郡名フィールドを変更てmanualyしなければならないということである私は、コードを実行したい:私は、私はそれらを一つずつを行うために使用できるスクリプトを持っていますcsvのすべてを通して。

私は単純なタスクを行うためにrを使いましたが、ループを使ってプロセスを自動化することに関しては素人です。このコードをループに挿入して、ファイルパスのフォルダ内のすべてのcsvを繰り返し実行する方法はありますか?

注:私は検索して、他の投稿でさまざまなオプションを試しましたが、私の状況にはうまくいかないようです。

+0

は 'list.files'関数を見ています。指定したディレクトリ内のすべてのファイルが一覧表示されます。結果を変数に代入し、その変数をループすることができます。 –

答えて

2

list.filesを使用すると、すべてのファイル名を取得できます。オプションfull.names = TRUEは、リレーショナルではなく、ファイル名の完全なパスを提供します。ここには、拡張可能でなければならない簡単な例があります。ベクターに/データ/ HAAS/tax_roll_data:

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

あなたは、フォルダC内のファイルを取得するために f <- list.files('C:/Data/HAAS/tax_roll_data', pattern='.csv')を使用することができます。そして、ループfを通じて、何かのように:あなたのCSVファイルのすべてを仮定し

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

#Rest of your script 
} 
0

は、同じ列名を持っている、あなたはこれを行うことができます。

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つのリストのうちの短いほうの値を再利用し、予期しない(そして望ましくない)結果を返します。

関連する問題