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

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