제어문과 다중파일 처리
in Notes / Dataanalytics / R / R Programming Language
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
- 09_data01폴더 내 txt파일들을 하나의 어휘단위벡터로 호출
- 소문자 변환, 어휘 양옆 문장부호 연쇄제거
- 빈도 내림차순 데이터프레임 생성(rownames=단어)
- 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:
- 09_data01 파일 내 txt파일 중 파일명에 숫자문자 포함되어 있는 파일만 추출
- 소문자 변환, 어휘 양옆 문장부호 연쇄제거
- 빈도 내림차순 데이터프레임 만들기
- 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:
- 작업폴더 밑에 Freq 폴더 만들기
- 작업폴더 변경 없이 ./09_data01 파일 내 txt파일 어휘단위 벡터로 불러오기
- 소문자변환, 양옆 문장부호 연쇄제거 뒤 각 파일마다 빈도 내림차순 데이터프레임 만들기
- 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") }