더북(TheBook)

때에 따라서는 다음에 보인 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을 의미한다. 그러나 이 값이 데이터에 꼭 필요한 정보가 아니면 생략하는 것이 낫다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.