CSV 파일 입출력
CSV 파일을 데이터 프레임으로 읽으려면 read.csv( )를, 데이터 프레임을 CSV로 저장하려면 write.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