'append = TRUE'에 해당되는 글 1건

  1. 2016.07.02 [R] 폴더 내 여러개 파일들을 Loop 돌려서 자동으로 불러오기 (41)

폴더에 자잘하게 쪼개진 여러개의 파일들이 있을 때, 그리고 이 파일들을 일일이 R로 불러오기 해야 할 때, 더그리고 이들 불러온 파일을 한개의 데이터셋을 합쳐야 할 때 (이쪽 동네 전문용어로) 노가다를 하지 않고 좀더 스마트하게 하는 방법을 소개하겠습니다.

 

순서는 다음과 같습니다.

  • (1) 폴더 경로 객체로 만들기
  • (2) 폴더 내 파일들 이름을 list-up 하여 객체로 만들기
  • (3) 파일 개수 객체로 만들기
  • (4) 폴더 내 파일들을 LOOP 돌려서 불러오기 : read.table()
  • (5) 파일을 내보내면서 합치기 : write.table(dataset, APPEND = TRUE)
  • (6) 데이터프레임으로 불러오기, 칼럼 이름 넣기 : read.table(dataset_all, col.names = c())

 

자, 예를 들면서 순서대로 R script 설명하겠습니다.

 

 

아래의 화면캡쳐 예시처럼 MyDocuments > R > FILES 폴더 아래에 daily로 쪼개진 10개의 text 파일들이 들어있다고 해봅시다.  (10개 정도야 일일이 불어올 수도 있겠지만, 100개, 1,000개 파일이 들어있다면?)

 

 

 

 

  • (1) 폴더 경로 객체로 만들기

> # cleaning up environment > rm(list=ls()) >

> # making directory as an object > src_dir <- c("C:/Users/Owner/Documents/R/FILES") # 경로 구분 : '\'를 '/'로 바꿔야 함 >
>
src_dir [1] "C:/Users/Owner/Documents/R/FILES" 

 

 

  • (2) 폴더 내 파일들 이름을 list-up 하여 객체로 만들기 : list.files()

> # listing up name of files in the directory => object
>

>
src_file <- list.files(src_dir) # list
>
> src_file [1] "day_20160701.txt" "day_20160702.txt" "day_20160703.txt" "day_20160704.txt" [5] "day_20160705.txt" "day_20160706.txt" "day_20160707.txt" "day_20160708.txt" [9] "day_20160709.txt" "day_20160710.txt"

 

 

 

"C:/Users/Owner/Documents/R/FILES" 디렉토리에 들어있는 파일들을 열어보면 아래와 같은 데이터들이 들어있습니다. (가상으로 만들어 본 것임)  daily로 집계한 데이터들이 들어있네요.

 

 

  • (3) 파일 개수 객체로 만들기 : length(list)

 

> # counting number of files in the directory => object
> 
> src_file_cnt <- length(src_file) >
> src_file_cnt [1] 10

 

 

 

여기까지 R을 실행하면 아래와 같이 environment 창에 객체들이 생겼음을 확인할 수 있습니다.

 

 


 

  • (4) 폴더 내 파일들을 LOOP 돌려서 불러오기
    => (5) 파일을 내보내면서 합치기 : write.table(dataset, APPEND = TRUE)


    : for(i in 1:src_file_cnt) {read.table()
                                     write.table(dataset, append = TRUE)}

 

> # write.table one by one automatiically, using loop program > for(i in 1:src_file_cnt) { + + # write.table one by one automatiically, using loop program + dataset <- read.table( + paste(src_dir, "/", src_file[i], sep=""), + sep=",", header=F, stringsAsFactors = F) + + # dataset exporting with 'APPEND = TREU' option, filename = dataset_all.txt + write.table(dataset, + paste(src_dir, "/", "dataset_all.txt", sep=""), + sep = ",", + row.names = FALSE, + col.names = FALSE, + quote = FALSE, + append = TRUE) # appending dataset (stacking) + + # delete seperate datasets + rm(dataset) + + # printing loop sequence at console to check loop status + print(i) + } [1] 1 [1] 2 [1] 3 [1] 4 [1] 5 [1] 6 [1] 7 [1] 8 [1] 9 [1] 10

 

 

 

여기까지 실행을 하면 아래처럼 MyDocuments>R>FILES 폴더 아래에 'dataset_all.txt' 라는 새로운 텍스트 파일이 하나 생겼음을 확인할 수 있습니다. 

 


 

 

새로 생긴 'dataset_all.txt' 파일을 클릭해서 열어보면 아래와 같이 'day_20160701.txt' ~ 'day_20160710.txt'까지 10개 파일에 흩어져있던 데이터들이 차곡차곡 쌓여서 합쳐져 있음을 확인할 수 있습니다.

 

 

 

 

  • (6) 데이터 프레임으로 불러오기 : read.table()
         칼럼 이름 붙이기 : col.names = c("var1", "var2", ...)

> # reading dataset_all with column names
> dataset_all_df <- read.table(
+   paste(src_dir, "/", "dataset_all.txt", sep=""), 
+   sep = ",", 
+   header = FALSE, # no column name in the dataset
+   col.names = c("ymd", "var1", "var2", "var3", "var4", "var5", 
+                 "var6", "var7", "var8", "var9", "var10"), # input column names
+   stringsAsFactor = FALSE, 
+   na.strings = "NA") # missing value : "NA"

 

 

 

우측 상단의 environment 창에서 'dataset_all_df' 데이터 프레임이 새로 생겼습니다.

클릭해서 열어보면 아래와 같이 'day_20160701.txt' ~ 'day_20160710.txt'까지 데이터셋이 합쳐져있고, "ymd", "var1" ~ "var10" 까지 칼럼 이름도 생겼습니다.

 

 

 

프로그래밍을 통한 자동화가 중요한 이유, 우리의 시간은 소중하니깐요~! ^^

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요.

 

 

====================================================================

(2018.03.14일 내용 추가)

 

댓글 질문에 '폴더에 있는 개별 파일을 하나씩 읽어와서 하나씩 DataFrame 객체로 메모리상에 생성하는 방법에 대한 질문이 있어서 코드 추가해서 올립니다. 위에서 소개한 방법과 전반부는 동일하구요, 마지막에 루프 돌릴 때 assign() 함수로 파일 이름을 할당하는 부분만 조금 다릅니다.

 

 

#=========================================================
# read all files in a folder and make a separate dataframe
#=========================================================

rm(list=ls()) # clear all

 

# (1) directory
src_dir <- c("D:/admin/Documents/R/R_Blog/326_read_all_files")

 

# (2) make a file list of all files in the folder
src_file <- list.files(src_dir)
src_file

 

 

# (3) count the number of files in the directory => object
src_file_cnt <- length(src_file)
src_file_cnt # 5

 

# (4) read files one by one using looping
#     => make a dataframe one by one using assign function
for (i in 1:src_file_cnt){
  assign(paste0("day_", i), 
         read.table(paste0(src_dir, "/", src_file[i]),
                    sep = ",",
                    header = FALSE))
  print(i) # check progress
}

 

rm(src_dir, src_file, src_file_cnt, i) # delete temp objects
ls() # list-up all dataframes

 

 

 

 

Posted by R Friend R_Friend