R 할줄 R지? #9 - 파일 읽기 및 저장

    R에는 다양한 포맷의 파일들을 매우 쉽게 가져오는 기능을 제공하고 있다. 파일의 입출력 실습은 붓꽃(IRIS) 데이터를 기반으로 진행해보도록 한다.


    아이리스 데이터

    1,5.1,3.5,1.4,0.2,Iris-setosa

    2,4.9,3,1.4,0.2,Iris-setosa

    3,4.7,3.2,1.3,0.2,Iris-setosa

    4,4.6,3.1,1.5,0.2,Iris-setosa

    5,5,3.6,1.4,0.2,Iris-setosa

    6,5.4,3.9,1.7,0.4,Iris-setosa

    7,4.6,3.4,1.4,0.3,Iris-setosa

    8,5,3.4,1.5,0.2,Iris-setosa

    9,4.4,2.9,1.4,0.2,Iris-setosa

    10,4.9,3.1,1.5,0.1,Iris-setosa

    11,5.4,3.7,1.5,0.2,Iris-setosa

    12,4.8,3.4,1.6,0.2,Iris-setosa

    ...


    iris.csv



    텍스트 파일 가져오기


    우선 read.table() 함수를 사용하여 파일을 읽을 수 있다. 


    옵션

    header : 첫번째 행이 헤더값(변수명)인지 아닌지를 판단한다. 1행이 변수명이면 header = TRUE

    skip : 특정 행까지 제외하고 데이터를 가져온다 (5행부터 가져오려면 skip = 4)

    nrows : 가져올 행의 개수 (총 5개의 행을 가져오려면 nrows=5)

    sep : 데이터 구분자를 지정한다 (쉼표로 구분되었다면 sep = ",")



    read.table

    > iris <- read.table("E:/study/R/data/iris.csv")

    > head(iris)

                                 V1

    1 1,5.1,3.5,1.4,0.2,Iris-setosa

    2   2,4.9,3,1.4,0.2,Iris-setosa

    3 3,4.7,3.2,1.3,0.2,Iris-setosa

    4 4,4.6,3.1,1.5,0.2,Iris-setosa

    5   5,5,3.6,1.4,0.2,Iris-setosa

    6 6,5.4,3.9,1.7,0.4,Iris-setosa

    아무런 옵션을 주지 않을 경우 다음과 같이 열이 한개로 데이터를 그냥 읽었다는 것을 알 수 있다. 즉 옵션을 주지 않으면 한줄을 통째로 읽는다



    > iris <- read.table("E:/study/R/data/iris.csv", sep=",")

    > head(iris)

      V1  V2  V3  V4  V5          V6

    1  1 5.1 3.5 1.4 0.2 Iris-setosa

    2  2 4.9 3.0 1.4 0.2 Iris-setosa

    3  3 4.7 3.2 1.3 0.2 Iris-setosa

    4  4 4.6 3.1 1.5 0.2 Iris-setosa

    5  5 5.0 3.6 1.4 0.2 Iris-setosa

    6  6 5.4 3.9 1.7 0.4 Iris-setosa

    sep="," 옵션을 주니, 이제 총 6개의 열을 만들어서 데이터를 읽어들였다.



    > iris <- read.table("E:/study/R/data/iris.csv", sep=",", skip=2, nrows=5)

    > iris

      V1  V2  V3  V4  V5          V6

    1  3 4.7 3.2 1.3 0.2 Iris-setosa

    2  4 4.6 3.1 1.5 0.2 Iris-setosa

    3  5 5.0 3.6 1.4 0.2 Iris-setosa

    4  6 5.4 3.9 1.7 0.4 Iris-setosa

    5  7 4.6 3.4 1.4 0.3 Iris-setosa

    2행까지 무시를 하고, 총 5개의 행을 가져오라는 명령을 주었다. 원본 데이터 기준으로 3행부터 7행까지 데이터를 가져온 것을 확인할 수 있다.


    read.csv

    read.table과 유사하지만, csv라는 함수로도 비슷한 업무를 수행한다

    > iris <- read.csv("E:/study/R/data/iris.csv")

    > head(iris)

      X1 X5.1 X3.5 X1.4 X0.2 Iris.setosa

    1  2  4.9  3.0  1.4  0.2 Iris-setosa

    2  3  4.7  3.2  1.3  0.2 Iris-setosa

    3  4  4.6  3.1  1.5  0.2 Iris-setosa

    4  5  5.0  3.6  1.4  0.2 Iris-setosa

    5  6  5.4  3.9  1.7  0.4 Iris-setosa

    6  7  4.6  3.4  1.4  0.3 Iris-setosa

    별다른 인수값을 주지 않은 상태로 호출 했을 때, 첫번째 행을 header로 잡아버린다. read.table과 다르게 콤마를 자동으로 구분자값으로 인식을 하였다.



    > iris <- read.csv("E:/study/R/data/iris.csv", header=F)

    > head(iris)

      V1  V2  V3  V4  V5          V6

    1  1 5.1 3.5 1.4 0.2 Iris-setosa

    2  2 4.9 3.0 1.4 0.2 Iris-setosa

    3  3 4.7 3.2 1.3 0.2 Iris-setosa

    4  4 4.6 3.1 1.5 0.2 Iris-setosa

    5  5 5.0 3.6 1.4 0.2 Iris-setosa

    6  6 5.4 3.9 1.7 0.4 Iris-setosa

    header=F를 추가하여 첫번째 행을 header로 인식하지 않고 데이터로 인식을 시켰다. 즉 header의 default 값은 T라는 것을 알 수 있다.



    파일 저장하기


    iris의 데이터를 읽은 후, iris2.csv로 저장(쓰기)하는 간단한 실습을 해보도록 한다


    write.table

    > iris <- read.csv("E:/study/R/data/iris.csv", header=F)

    > write.table(iris, "E:/study/R/data/iris2.csv")



    해당 위치에 iris2.csv 파일이 생성된 것을 확인할 수 있으며 파일을 열면



    다음과 같이 데이터가 들어갔으나, 일부 데이터에 더블쿼테이션이 감싸고 있고, 구분자가 공백으로 되어 있는 것을 확인할 수 있다. 더블쿼테이션을 없애고, 구분자를 콤마(,)로 변경하고 싶으면 2개의 인자값을 추가한다


    > write.table(iris, "E:/study/R/data/iris2.csv", quote=F, sep=",")



    quote는 문자형 데이터에 쌍따옴표를 추가할지를 결정하고, sep은 구분자 값을 어떤 문자열로 할 지 선택한다.



    write.csv

    write.csv(iris, "E:/study/R/data/iris3.csv")


    write.csv를 사용하면 파일을 기본적으로 CSV 포맷 기반으로 저장할 수 있다. 



    csv기반으로 저장할 경우 table 방식과 차이점은 구분자값이 공백이 아니라 쉼표라는 것이다. 여기에 추가적으로 더블쿼테이션을 삭제해보도록 한다


    write.csv(iris, "E:/study/R/data/iris3.csv", quote=F)



    quote=F 인자값을 추가로 넣으면 다음과 같이 더블쿼테이션이 빠진 것을 확인할 수 있다.


    댓글

    Designed by JB FACTORY