더북(TheBook)

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
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.