CSV 파일 입출력

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

    표 4-3 CSV 파일 입출력 함수

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

    read.csv(
      file,          # 파일명
      header=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. Baz"
     $ 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. Baz"
     $ score: int 95 97 92
    
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.