제어문과 다중파일 처리

Another widely used data structure for data analyzing

파일 경로 다루기

  • 사실 데이터분석 단계에서 제어문 잘 안씀 (이미 벡터단위로 연산이 잘 되어 있기 때문)
> list.files()
[1]  폴더  모든 파일명 출력
> list.files(path='.')
위와 동일
> list.files(path= '.\\09_data01')
 경로 변환, 상대경로로 진입
> list.files(path= '.\\09_data01', pattern = '[.]txt$')
 txt확장자 가진 파일명만 출력
> list.files(path='..')
 바깥 파일들 출력


> getwd()
[1] "C:/R"   현재 경로 출력

> setwd("./newDirectory")
> getwd()
[1] "C:/R/newDirectory" setwd사용해서 현재 경로 변경

> setwd("..")
> getwd()
[1] "C:/R" 다시 나옴

> dir.create("./out")
 폴더 생성 (삭제: unlink함수 참고)

for 문 사용해서 다중파일 읽어오기

> TEXTS <- vector()     #initialize
> for (i in list.files(path="./09_data01", pattern='[.]txt$')){
  file <- scan(file= paste("./09_data01/", i, sep=""), what="char", quote=NULL)
  TEXTS<- c(TEXTS, file)
}

if 문 사용해서 다중파일 나누기 (홀수,짝수별로)

  • newFile폴더 내 파일: [01.txt, 02.txt, 03.txt, 04.txt]

    > A <- vector()
    > B <- vector()
    > for ( i in list.files( path="./09_data01", pattern = '[.]txt$')){
    
      file <- scan( file=paste0("./09_data01/", i), what="char", quote=NULL)
      j <- as.numeric(substring( i, 1, 2)) #integer로 변경 (원래는 string임)
      if (j %%2 == 1)
          A <- c(A, file)
      else
          B <- c(B, file)
      }
    

연습문제

  • 연습문제 #1

    1. 09_data01폴더 내 txt파일들을 하나의 어휘단위벡터로 호출
    2. 소문자 변환, 어휘 양옆 문장부호 연쇄제거
    3. 빈도 내림차순 데이터프레임 생성(rownames=단어)
    4. Freq.txt 저장
    > TEXT <- vector()
    > for ( i in list.files( path="./09_data01", pattern = '[.]txt$')){
    
           file <- scan( file=paste0("./09_data01/", i), what="char", quote=NULL)
           TEXT<- c(TEXT, file)
       }
    > text <- gsub('^[[:punct:]]+|[[:punct:]]+$', '', tolower(TEXT))
    > text_table = sort(table(text), decreasing = T)
    > Freq <- data.frame(row.names=names(text_table), Freq = as.vector(text_table))
    >  write.table(Freq, file="Freq.txt", sep="\t", col.names=NA, quote=F)
    
    
    


  • 연습문제 #2:

    1. 09_data01 파일 내 txt파일 중 파일명에 숫자문자 포함되어 있는 파일만 추출
    2. 소문자 변환, 어휘 양옆 문장부호 연쇄제거
    3. 빈도 내림차순 데이터프레임 만들기
    4. Freq.txt로 출력
    > TEXTS <- vector()
    > for ( i in list.files(path = "./09_data01", pattern="[.]txt$")){
    +         file <- scan(file = paste("./09_data01/", i, sep=""), quote=NULL, what = "char")
    +         if (length(grep('[[:digit:]]', file))>0 ){
    +                TEXTS <- c( TEXTS, gsub('^[[:punct:]]+|[[:punct:]]+$', "", tolower(file)))
    + }}
    
        
    > Freq <- sort( table(TEXTS), decreasing = T)
    > Freq <- data.frame(row.names= names(Freq), Freq=as.vector(Freq))
    > write.table(Freq, file= "Freq.txt", quote= F, sep="\t", col.names=NA)
    
    


  • 연습문제 #3:
    1. 작업폴더 밑에 Freq 폴더 만들기
    2. 작업폴더 변경 없이 ./09_data01 파일 내 txt파일 어휘단위 벡터로 불러오기
    3. 소문자변환, 양옆 문장부호 연쇄제거 뒤 각 파일마다 빈도 내림차순 데이터프레임 만들기
    4. Freq 폴더 내 01_Freq.txt, 02_Freq.txt 등으로 저장하기
    > dir.create("./Freq")
    
    > for ( i in list.files(path="./09_data01", pattern = "[.]txt$")){
        file <- scan( file= paste("./09_data01/", i, sep=""), quote=NULL, what="char", encoding="UTF-8")
        temp <- gsub("^[[:punct:]]+|[[:punct:]]+$", "", tolower(file))
        freq <- sort(table(temp), decreasing = T)
        Freq <- data.frame(row.names=rownames(freq), Freq = as.vector(freq))
        write.table(Freq, file = paste( "./Freq/", gsub("[.]txt", "", i), "_Freq.txt", sep=""), 
                          quote= F, fileEncoding = "UTF-8", col.names=NA, sep="\t")
      }