본문 바로가기

R/R을 이용한 데이터 처리&분석 실무

파일 입출력

반응형

이 절에서는 CSV로 저장된 외부 데이터 파일을 데이터 프레임으로 불러들이는 방법, 데이터 프레임을 CSV로 저장하는 방법을 설명한다.

 

프로그램 수행 중에 긴 시간이 소요되는 작업을 실행한 뒤에는 중간 중간 실행 결과를 저장해놓고 싶을 때가 있다. 이때 사용할 수 있는 R 객체를 바이너리 형태로 파일에 저장했다가 불러들이는 방법에 대해서도 설명한다.

 

CSV 파일 입출력

CSV 파일을 데이터 프레임으로 읽으려면 read.csv()를, 데이터 프레임을 CSV로 저장하려면 write.csv()를 사용한다. 아래에 이 함수들의 프로토타입을 보였다.

 

-read.csv : CSV 파일을 데이터 프레임으로 읽어들인다.

read.csv(
   file,                        #파일명

   geader=FALSE,         #파일의 첫 행을 헤더로 처리할 것인지 여부

#데이터에 결측치가 포함되어 있을 경우 R의 NA에 대응시킬 값을 지정한다.

#기본값은 "NA"로, "NA"로 저장된 문자열들은 R의 NA로 저장된다.

   na.strings="NA", 

#문자열을 팩터로 저장할지 또는 문자열로 저장할지 여부를 지정하는 데 사용한다. 

#별다른 설정을 하지 않았다면 기본값은 보통 TRUE다.

   stringsAsFactors=default.stringsAsFactors()

)

 

-write.csv : 데이터 프레임을 CSV로 저장한다.

write.csv(

   x,                         #파일에 저장할 데이터 프레임 또는 행렬

   file="",                  #데이터를 저장할 파일명

   row.names=TRUE    #TRUE면 행 이름을 CSV 파일에 포함하여 저장한다.

)

 

read.csv(), write.csv()를 사용한 파일 입출력을 알아보자. 다음과 같은 a.csv 파일이 있다고 하자.

id, name, score
1, "Mr. Foo", 95
2, "Ms. Bar", 97
3, "Mr. Baz", 92

 

이 파일의 첫 행은 열의 이름이다. read.csv()를 사용해 파일을 읽어보자.

>(x<-read.csv("a.csv"))
   id     name   score
1 1   Mr. Foo    95
2 2   Ms. Bar    97
3 3   Mr. Baz    92

>str(x)
'data.frame' :       3 obs. of 3 variables:
$ id      : int 1 2 3
$ name : Factor w/3 levels "Mr. Baz", "Mr. Foo", .. : 2 3 1
$ score : int 95 97 92

 

보다시피 읽어들인 파일은 데이터 프레임으로 반환된다.

 

b.csv 파일에는 다음과 같이 헤더 행이 없다고 가정해보자.

 

1, "Mr. Foo", 95
2, "Ms. Bar", 97
3, "Mr. Baz", 92

 

이 경우에는 다음과 같이 header=FALSE를 지정한다. 헤더가 없어 컬럼의 이름이 주어지지 않게 되므로, 다음 예에서 보인 바와 같이 names()를 사용해 별도로 컬럼 이름을 지정해야 한다.

>(x<-read.csv("b.csv"))
   x1  Mr..Foo  x95
1  2   Ms. Bar  97
2  3   Mr. Baz  92

>names(x)<-c("id", "name", "score")
>x
   id    name    score
1  2   Ms. Bar    97
2  3   Mr. Baz    92

>str(x)
'data.frame':          2 obs.  of 3 variables:
$ id      : int 2 3 
$ name : Factor  w/  2 levels "Mr. Baz", "Ms. Bar" : 2 1
$ score : int 97 92

 

위에서 데이터를 읽어들인 결과를 보면 name 컬럼이 모두 팩터 형태로 변환되었다. 그러나 이름은 범주형 변수가 아니므로 다음과 같이 다시 문자열로 변환해줘야 한다.

>x$name <- as.character(x$name)
>str(x)
'data.frame' :       3 obs.  of 3 variables:
$ id      : int 1 2 3
$ name : chr "Mr. Foo" "Ms. Bar" "Mr. Bar"
$ score : int 95 97 92

 

또는 처음부터 문자열을 팩터가 아니라 문자열 타입으로 읽도록 stringsAsFactors=FALSE를 지정해도 된다.

>x <- read.csv("a.csv", stringsAsFactors=FALSE)
>str(x)
'data.frame' :       3 obs.  of 3 variables:
$ id      : int 1 2 3
$ name : chr "Mr. Foo" "Ms. Bar" "Mr. Bar"
$ score : int 95 97 92

 

때에 따라서는 다음에 보인 c.csv 파일처럼 데이터에 NA를 지정하는 문자열이 저장되어 있을 수도 있다.

id, name, score
1, "Mr. Foo", 95
2, "Ms. Bar", NIL
3, "Mr. Baz", 92

 

이 데이터를 read.csv()로 읽어들이면 NIL이 문자열이므로 팩터로 저장된다. 그 결과 score 컬럼 전체가 팩터가 된다.

>(x<-read.csv("c.csv"))
   id    name    score
1  1   "Mr. Foo"  95
2  2   "Ms. Bar"  NIL
3  3   "Mr. Baz"  92

>str(x)
'data.frame':      3 obs.  of 3 variables:
$ id      : int   1 2 3
$ name : Factor  w/3  levels "Mr. Baz", "Mr. Foo",..: 2 3 1
$ score : Factor  w/3  levels " 92", " 95", " NIL" : 2 3 1

 

이러한 결과를 피하려면 na.strings 인자를 사용한다. na.strings의 기본값은 "NA"로, "NA"라는 문자열이 주어지면 이를 R이 인식하는 NA로 바꿔준다. 이 예에서는 na.strings=c("NIL")을 사용해 NIL을 NA로 지정할 수 있다. na.strings에 지정하는 값은 벡터므로 여러 문자열을 벡터로 지정하면 벡터 내 모든 문자열이 NA로 저장된다.

 

>x<-read.csv("c.csv", na.strings=c("NIL"))
>str(x)
'data.frame':     3 obs. of 3 variables:
$ id      : int 1 2 3
$ name : Factor w/3 levels "Mr. Baz", "Mr. Foo",..: 2 3 1
$ score  : int 95 NA 92

>is.na(x$score)
[1] FALSE TRUE FALSE

 

is.na()로 확인한 결과 NIL이 NA로 잘 변환되었음을 볼 수 있다.

 

데이터를 CSV 파일로 저장하려면 write.csv()를 사용한다. 다음 예에서는 row.names를 FALSE로 지정하여 행 이름은 제외하고 파일에 저장한다.

>write.csv(x, "d.csv", row.names=FALSE)

 

결과 파일 d.csv는 다음과 같다.

"id", "name", "score"
1, "Mr. Foo", 95
2, "Ms. Bar", 97
3, "Mr. Baz", 92

 

만약 row.names=FALSE를 지정하지 않고 CSV 파일로 데이터를 저장하면 다음과 같은 결과를 얻는다.

"","id", "name", "score"
"1",1, "Mr. Foo", 95
"2",2, "Ms. Bar", 97
"3",3, "Mr. Baz", 92

 

이 CSV 파일의 첫 컬럼의 행 번호 1,2,3을 의미한다. 그러나 이 값이 데이터에 꼭 필요한 정보가 아니면 생략하는 것이 낫다.

 

객채의 파일 입출력

데이터를 다양한 알고리즘으로 장시간 처리한 뒤 파일에 저장해두면 나중에 같은 계산을 반복할 필요가 없어 효율적이다. 바이너리 파일로 R 개체를 저장하고 불러들이는 함수에는 save(), load()가 있다.

 

-save : 메모리에 있는 객체를 파일에 저장한다.

save(
   ...,                      #저장할 객체의 이름

   list=character(),     #저장할 객체의 이름을 벡터로 지정할 경우 ... 대신 사용

   file                     #파일명

)

 

-load : 파일로부터 객체를 메모리에 읽어들인다.

load(

   file     #파일명

)

 

다음은 두 벡터 x,y를 xy.RData 파일에 저장하는 예다.

>x<-1:5
>y<-6:10
>save(x,y,file="xy.RData")

 

메모리에 있는 모든 객체를 저장하고자 한다면 메모리에 있는 객체 목록을 조회하는 함수 ls()의 결과를 list 인자에 지정할 수 있다. 다음은 a, b, c 객체를 파일 abc.RData에 저장하는 예다.

>rm(list=ls())
>a<-1:5
>b<-6:10
>c<-11:15
>save(list=ls(),file"abc.RData")

 

파일로부터 데이터를 불러들이는 함수는 load()다. 다음 코드는 abc.RData 파일로부터 a, b, c객체를 불러들이는 예를 보여준다.

>rm(list=ls())
>ls()
character(0)
>load("abc.RData")
>ls()
[1]"a" "b" "c"
>a
[1] 1 2 3 4 5
>b
[1] 6 7 8 9 10
>c
[1] 11 12 13 14 15

 

 

R을 이용한 데이터 처리&분석 실무 中

반응형

'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글

apply 계열 함수 - 1  (0) 2020.02.01
데이터 프레임의 행과 컬럼 합치기  (0) 2020.01.31
아이리스 데이터  (0) 2020.01.31
함수의 정의  (0) 2020.01.30
연산  (0) 2020.01.30