본문 바로가기
2. 데이터/1) 데이터 불러오기

R에서 csv(콤마 구분 데이터)파일 불러오는 방법, read.csv()

by makhimh 2020. 1. 21.
반응형

R에서 csv(콤마 구분 데이터)파일 불러오는 방법, read.csv()


csv파일은 comma-separated values 의 약자입니다. 콤마 즉 , 기호로 구분된 값이라는 뜻입니다. 메모장파일을 하나 만들어봅시다. 



메모장의 경로는 아래와 같습니다.


"C:/Users/Public"


먼저 working directory를 위 경로로 바꿔야합니다. 아래와 같은 코드를 실행합니다. 


> setwd("C:/Users/Public")


이제 메모장을 불러옵시다. read.table함수를 사용합니다. 다양한 옵션이 있지만 일단은 옵션 지정 없이 불러오겠습니다. 


> a=read.csv("mytxt.txt")


아래와 같이 잘 불러와졌습니다. 자료구조는 data.frame입니다. 


> a=read.csv("mytxt.txt")

> a

  a b c

1 1 2 3

2 4 5 6

3 7 8 9


read.csv 함수는 read.table 함수와 디폴트 셋팅값만 다른 함수입니다. 따라서 read.csv 대신, read.table 함수에다가 sep옵션만 콤마로 바꿔서 사용해도 됩니다. 


두 디폴트셋팅값을 비교해봅시다. 


read.table(file, header = FALSE, sep = "", quote = "\"'",

         dec = ".", fill = !blank.lines.skip, comment.char = "#", ...)


read.csv(file, header = TRUE, sep = ",", quote = "\"",

         dec = ".", fill = TRUE, comment.char = "", ...)


read.csv에서는 헤더 TRUE가 디폴트이고 sep 디폴트가 콤마입니다. 또 quote에서 따옴표 ' 가 빠졌고, fill 디폴트값도 다릅니다. 코멘트 기호도 없어졌습니다. 


아래는 read.csv 함수의 옵션입니다. R documentation에는 생략되어있는데 재구성해보았습니다. 


read.csv(file, header = TRUE, sep = ",", quote = "\"",

           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),

           row.names, col.names, as.is = !stringsAsFactors,

           na.strings = "NA", colClasses = NA, nrows = -1,

           skip = 0, check.names = TRUE, fill = TRUE,

           strip.white = FALSE, blank.lines.skip = TRUE,

           comment.char = "",

           allowEscapes = FALSE, flush = FALSE,

           stringsAsFactors = default.stringsAsFactors(),

           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)


header는 메모장의 맨 윗줄을 열이름으로 취급할지 여부를 결정합니다. 위 메모장파일을 header=FALSE로 불러와보겠습니다.



> a=read.csv("mytxt.txt",header=FALSE)

> a

  V1 V2 V3

1  a  b  c

2  1  2  3

3  4  5  6

4  7  8  9


sep는 원소와 원소 사이를 무엇으로 구분할지 결정합니다. 디폴트는 "," 입니다.


quote는 인용문이라는 뜻인데, 쉽게말하면 입력된 인용부호를 가져오지 않고 인용부호 사이에 있는 값만 가져온다는 의미입니다. 예를들어 "*" 라고 한다면, *를 구분자(delimiter) 취급하겠다는 말입니다. 쌍따옴표의 경우 \" 형식으로 입력합니다. """을 할 경우 함수가 정의되지 않기 때문입니다. \"는 "의 ASCII quotation mark입니다. 


메모장에 아래와 같이 입력되어 있다고 합시다.



quote에 *을 설정하고 불러오면 아래와 같이 숫자만 불러와집니다. 


> a=read.csv("mytxt.txt",quote="*",header=FALSE)

> a

  V1 V2 V3 V4

1  1  2  3  4


dec는 소수점의 기호입니다. 


numerals 는 원래의 값을 얼마나 보존할지 결정합니다. 예를들어 1.1111111111111111 가 메모장에 입력되어 있다고 합시다. 



각 옵션의 결과는 아래와 같습니다. 


> a1=read.csv("mytxt.txt",header=FALSE,numerals="allow.loss")

> a1

        V1

1 1.111111


> a2=read.csv("mytxt.txt",header=FALSE,numerals="warn.loss")

Warning message:

In type.convert.default(data[[i]], as.is = as.is[i], dec = dec,  :

  accuracy loss in conversion from "1.1111111111111111" to numeric

> a2

        V1

1 1.111111


> a3=read.csv("mytxt.txt",header=FALSE,numerals="no.loss")

> a3

                  V1

1 1.1111111111111111


a1과 a2는 정확도가 같습니다. 차이는 a2에서 warning을 한다는 것입니다. a3의 정확도가 가장 높습니다. 오히려 1이 더 많아졌는데, 이유는 아직 모르겠네요. 


row.names와 col.names는 행과 열의 이름을 부여합니다. 아래와 같이 메모장에 입력되어 있다고 합시다. 



row.names와 col.names를 지정하고 불러와보겠습니다. 


> a=read.csv("mytxt.txt",header=FALSE,row.names=c("r1","r2"),col.names=c("c1","c2","c3"))

> a

   c1 c2 c3

r1  1  2  3

r2  4  5  6


as.is는 string을 factor로 인식할지 여부를 결정합니다. FALSE가 디폴트이고, TRUE로 설정시 factor로 인식하지 않습니다. 



str함수를 이용하여 열(column)별 데이터를 확인해보면 문자형이 factor로 인식된 것을 알 수 있습니다. 


> a1=read.csv("mytxt.txt",header=FALSE)

> str(a1)

'data.frame': 2 obs. of  3 variables:

 $ V1: int  1 4

 $ V2: int  2 5

 $ V3: Factor w/ 2 levels "a","b": 2 1


as.is를 TRUE로 할 경우 factor로 인식되지 않습니다. 


> a2=read.csv("mytxt.txt",header=FALSE,as.is=TRUE)

> str(a2)

'data.frame': 2 obs. of  3 variables:

 $ V1: int  1 4

 $ V2: int  2 5

 $ V3: chr  "b" "a"


na.strings 는 어떤 문자열을 NA로 인식할지 결정합니다. 아래 메모장에서 nanana를 NA로 인식하고 싶다고 합시다.



옵션을 아래와 같이 설정해줍니다. nanana가 NA로 인식됩니다. 


> a=read.csv("mytxt.txt",header=FALSE,na.strings="nanana")

> a

  V1 V2 V3

1  1  2 NA

2  1  2  3


colClasses는 열(column)을 어떤 class로 인식할지 결정합니다. 디폴트는 NA인데, NA로 설정할 경우 type.convert 함수가 사용됩니다. type.convert 함수는 어떤 데이터를 적절한 자료형으로 바꿔줍니다. (궁금하신 분들은 링크 클릭). colClasses 에는 NA 말고도 NULL, factor, Date, POSIXct, character 등으로 설정할 수 있습니다. 


아래와 같이 메모장에 입력되어 있다고 합시다. 



colClasses를 character로 설정할 경우, 모든 열(column)이 character로 인식됩니다. 


> a=read.csv("mytxt.txt",header=FALSE,colClasses="character")

> str(a)

'data.frame': 2 obs. of  3 variables:

 $ V1: chr  "1" "1"

 $ V2: chr  "2" "2"

 $ V3: chr  "3" "3"


nrows는 메모장에서 몇줄까지 불러들일지 결정합니다. 음수로 설정할 경우 명령어가 무시됩니다. 즉, 모든 줄을 다 불러온다는 말입니다. 아래와 같은 메모장이 있다고 합시다.



두줄만 불러오고 싶을 때, nrows=2 옵션을 추가해주면 됩니다. 


> a=read.csv("mytxt.txt",header=FALSE,nrows=2)

> a

  V1 V2 V3

1  1  2  3

2  4  5  6


skip은 처음 몇번째 줄까지 건너뛸지를 결정합니다. 아래와 같은 메모장이 있다고 합시다.



세번째줄 부터= 불러오고 싶을 때, skip=2 옵션을 추가해주면 됩니다. 


> a=read.csv("mytxt.txt",header=FALSE,,skip=2)

> a

  V1 V2 V3

1  7  8  9

2 10 11 12


check.names는 header를 열이름으로 인식할 경우 유효한 이름으로 바꿔주는 역할을 합니다. TRUE로 설정하면, 이름이 유효하지 않을 경우 make.names 함수를 이용하여 이름을 바꿔줍니다. 아래와 같은 메모장이 있다고 합시다. 



두번째 열의 이름은 숫자로 시작하기 때문에 유효하지 않습니다. check.names 옵션을 사용할 경우 아래와 같이 이름을 바꿔줍니다.


> a1=read.csv("mytxt.txt",check.names=TRUE)

> a1

  r1 X2 r3

1  1  2  3

2  4  5  6

3  7  8  9

4 10 11 12


check.names 옵션을 사용하지 않을 경우입니다. 


> a2=read.csv("mytxt.txt",check.names=FALSE)

> a2

  r1  2 r3

1  1  2  3

2  4  5  6

3  7  8  9

4 10 11 12


fill 옵션은 비어있는 부분을 NA로 채울지 여부를 결정합니다. 디폴트 TRUE인데, 비어있는 부분을 NA로 채워줍니다. FALSE로 설정할 경우 채우지 않고 오류를 반환합니다. 


아래와 같은 메모장이 있습니다. 



먼저 TRUE로 설정할 경우 빈 데이터에 NA를 추가해줍니다. 


> a=read.csv("mytxt.txt",header=FALSE,fill=TRUE)

> a

  V1 V2 V3

1  1  2  3

2  4 NA  6

3  7  8  9


FALSE로 설정할 경우 채우지 않고 오류를 반환해야하는데, NA로 바꿔버리네요. 이부분은 더 알아봐야합니다. 


> a=read.csv("mytxt.txt",header=FALSE,fill=FALSE)

> a

  V1 V2 V3

1  1  2  3

2  4 NA  6

3  7  8  9


strip.white 옵션은 문자 앞에 띄어쓰기와 같은 whitespace가 있는 경우 이를 trim(잘라내기)할지 여부를 결정합니다. TRUE로 할 경우 잘라냅니다. "" 안에 있는 whitespace는 자르지 않습니다. sep옵션이 설정된 경우에만 작동합니다. 


아래와 같은 메모장이 있다고 합시다. 



strip.white 옵션을 설정하지 않을 경우 아래와 같이 e앞에 있는 빈칸이 그대로 입력됩니다. 


> a1=read.csv("mytxt.txt",header=FALSE)

> str(a1)

'data.frame': 2 obs. of  3 variables:

 $ V1: Factor w/ 2 levels "a","d": 1 2

 $ V2: Factor w/ 2 levels "  e","b": 2 1

 $ V3: Factor w/ 2 levels "c","f": 1 2


strip.white 옵션을 설정하면 아래와 같이 trim됩니다. 


> a2=read.table("mytxt.txt",sep=",",strip.white=TRUE)

> str(a2)

'data.frame': 2 obs. of  3 variables:

 $ V1: Factor w/ 2 levels "a","d": 1 2

 $ V2: Factor w/ 2 levels "b","e": 1 2

 $ V3: Factor w/ 2 levels "c","f": 1 2


blank.lines.skip 옵션은 비어있는 줄을 결과에 포함할지 여부를 결정합니다. TRUE가 디폴트인데, 빈 줄을 결과에 포함하지 않습니다. 아래와 같은 메모장이 있다고 합시다. 



내용을 불러오면 아래와 같이 빈 줄이 생략됩니다. 


> a1=read.csv("mytxt.txt",header=FALSE)

> a1

  V1 V2 V3

1  1  2  3

2  4  5  6

3  7  8  9


blank.lines.skip 옵션을 FALSE로 설정해봅시다. 빈 줄이 생략되지 않습니다. NA로 채워집니다. 


> a2=read.csv("mytxt.txt",header=FALSE,blank.lines.skip=FALSE)

> a2

  V1 V2 V3

1  1  2  3

2 NA NA NA

3  4  5  6

4  7  8  9


comment.char 옵션은 주석 기호를 무엇으로 할지 결정합니다. 디폴트는 주석을 인식하지 않습니다. 아래와 같은 메모장이 있다고 합시다. 



아래와 같이 주석기호를 인식하지 않습니다. 


> a1=read.csv("mytxt.txt",header=FALSE)

> a1

                V1 V2 V3

1                1  2  3

2 #this is comment NA NA

3                4  5  6

4                7  8  9


이번에는 주석을 추가해봅시다. comment.char="#" 이라는 옵션을 추가합니다. 


> a2=read.csv("mytxt.txt",header=FALSE,comment.char="#")

> a2

  V1 V2 V3

1  1  2  3

2  4  5  6

3  7  8  9


주석부분이 생략됩니다. 


allowEscapes는 \n이나 \t와 같은 C-style escapes를 어떻게 처리할지 결정합니다. TRUE로 할 경우 구분문자(delimiter)처리를 각 escapes의 역할에 맞게 작동합니다. FALSE로 할 경우 문자로 인식합니다. 아래와 같은 메모장이 있다고 해봅시다. 



디폴트로 실행할 경우 allowEscapes에 FALSE가 입력되어 escapes를 하나의 문자로 인식합니다. 


> a1=read.csv("mytxt.txt",header=FALSE)

> a1

  V1 V2 V3  V4 V5 V6 V7  V8 V9 V10 V11

1  1  2  3 \\n  4  5  6 \\n  7   8   9


TRUE로 설정할 경우 엔터 역할을 합니다. 왜 앞에 두줄이 더생기는지는 아직 모르겠습니다. 


> a2=read.csv("mytxt.txt",header=FALSE,allowEscapes=TRUE)

> a2

  V1 V2 V3 V4

1 NA  4  5  6

2 NA  7  8  9

3  1  2  3 NA

4 NA  4  5  6

5 NA  7  8  9


flush 옵션은 scan 함수에서 파일을 list 형태로 읽을때 사용되는건데, read.table에서의 사용은 찾는 중입니다. 


stringsAsFactors 옵션은 문자열을 factor로 인식할지 여부를 결정합니다. 위에서 as.is 나 colClasses도 비슷한 기능을 하는데요. as.is 와 colClasses가 더 우선권을 갖습니다. 


fileEncodine과 encoding 옵션은 파일이 인코딩된 포멧을 다루는 옵션입니다. 아직 이부분은 이해를 못했습니다. 공부해서 업데이트하겠습니다.  


text옵션은 파일이 없을 때, 메모장에 입력하듯 입력할 수 있게해주는 옵션입니다. 아래는 예시입니다. 


> a=read.csv(header=FALSE,text = "

+ 1,2,3

+ 3,4,5

+ ")


> a

  V1 V2 V3

1  1  2  3

2  3  4  5


skipNul 옵션은 뭔지 모르겠네요. 나중에 알게되면 추가하겠습니다. 




간혹 아래와 같은 경고가 뜨는 경우가 있습니다. 


> a=read.csv("mytxt.txt")

Warning message:

In read.table("mytxt.txt") :

  'mytxt.txt'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막 라인입니다


이런경우 메모장 마지막줄에서 엔터를 눌러 개행해주시면 경고가 사라집니다. 

반응형

댓글