1.6 자료 읽기 (Loading Data into R Environment)

위에서 자료를 ’읽는다’는 표현은 ’사람이 책을 읽듯이 읽는다’는 것이 아니고, 컴퓨터가 어떤 환경(여기서는 R)에서 사용가능하도록 ’가져온다(탑재한다)’는 뜻이다.

read.csv() 함수를 이용한다.

자기 컴퓨터에 저장되어 있는 경우에는 다음과 같은 형태로 읽을 수 있다.

d0 = read.csv("C:/R/Study01/1-Data/Dosing.csv")

(위 문장은 사용법 예시일 뿐이며, Dosing.csv라는 파일이 자기 컴퓨터에 있는 경우를 상정한 것이다.)

인터넷에 누군가 자료를 만들어 놓았다면 internet URL을 써도 자료를 읽을 수 있다.

d2 = read.csv("http://r.acr.kr/ARS20-8p8.csv") ; d2

만약 R 3.x 를 사용하고 있다면, as.is=T라는 옵션을 쓰는 것이 좋다.

read.csv("http://r.acr.kr/ARS20-8p8.csv", as.is=T)

이유는 R 3.x에서 as.is=T라는 옵션이 없으면 문자 형태(character type)의 컬럼은 factor type으로 자동으로 변환하기 하는데, factor type이 data cleaning에는 더 번거롭기 때문이다.

R 4.x이후는 character type을 그대로 두기 때문에, as.is=T 또는 stringsAsFactors=F 옵션이 필요 없게 되었다.

위에서 T는 TRUE의 인정되는 약어이다.

다른 사람이 준비한 자료를 받는 경우도 있고, 그것이 만약 .txt (simple ASCII text) 파일이라면 read.table() 함수를 사용할 수 있다.

d1 = read.table("http://r.acr.kr/demog0.txt", skip=2, header=T, sep=",")

위의 skip=2 옵션은 첫 두 줄을 건너뛰고 읽으라는 뜻이다.

이 때 skip후의 첫 행이 컬럼이름이면 header=T 라는 옵션을 지정해 주어야 한다.

자료를 읽은 후에는 어떤 object(위에서는 그 이름을 d0, d2, d1 등으로 붙였다.)에 저장해야 한다.

읽은 내용을 보고 싶으면 그 object name을 typing하거나, print() 함수를 사용할 수 있다.

d2
# or
print(d2)

만약 양이 너무 많으면 head(), tail() 함수를 이용해서 일부만 볼 수 있고, 추가 인자를 지정해주지 않으면 6줄만 보여주는데, 보여줄 행의 수를 지정해 줄 수도 있다.

head(d1)
tail(d1)
head(d1, 10)

읽은 자료의 단순 기술 통계량(simple descriptive statistics) 몇 가지를 summary() 함수로 볼 수 있다. (여기에 표준편차는 포함되어 있지 않다.)

summary(d1)

단순히 행의 수만 보는 nrow()와 NROW() 함수, 열의 수만 보여주는 ncol()과 NCOL() 함수가 있다. (차이에 대해서는 각자 알아보기 바란다.)

행과 열의 수를 동시에 보여주는 (즉, 차원별 element 수를 보여주는) dim() 함수도 있다.

nrow(d1)
ncol(d1)
dim(d1)

만약 1차원 배열(one dimensional array)이라면 length() 함수를 이용해서 element의 수를 볼 수도 있다. 하지만, 2차원 이상에서는 혼동을 일으킬 수 있으므로 사용을 추천하지 않는다.

어떤 object들의 내부 구조를 좀 더 자세히 들여다보고 싶으면 str() 함수를 사용할 수 있다.

str(d1)

위에서 읽은 자료는 d1이라는 object에 저장되어 있는데, 그것의 class는 data.frame이다. data.frame은 컬럼별로 (문자, 숫자 등) 다른 type을 가질 수 있다. 반면에 배열(array)은 전체가 동일한 type이어야 한다. 즉, 모두 문자이거나, 모두 숫자이어야 한다. 개개 원소가 숫자이면서 1차원인 배열을 수학에서는 벡터(vector)라고 부르고 2차원인 배열을 행렬(matrix)이라고 부르지만, R에서는 문자들이 들어 있어도 matrix로 부른다.

어떤 object의 class를 확인할 수 있는 class() 함수가 있고, is() 함수도 있다. 하나의 object는 동시에 여러 class가 될 수 있다. class() 함수는 가장 먼저 적용되는 class만 보여주고, is() 함수는 그를 포함하는 class들까지 다 보여준다. (원래 OOP에서는 class들 간에는 containment hierarchy와 inheritance hierarchy가 있다.)

Heterogenous element를 c() 함수를 이용하여 concatenate하면 list type이 생성되게 된다. 따라서, data.frame은 컬럼(column, 열)들이 결합된 list의 일종이다.