이 절에서는 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 |