R 기본 1: 데이터 다루기
변수와 값
다음을 R에서 실행해보자. 결과가 예상대로 나오는가?
다음은 어떤 결과가 나오겠는가? 먼저 예상한 후 실행 해 보자
참고로 <- 는 오른쪽의 값을 왼쪽에 대입하라는 뜻이며, = 로 대체할 수 있다.
기대했던 결과가 안 나온다면 다음을 실행 해 보자
이것은 어떤 결과가 나오겠는가?
변수와 벡터
벡터(vector)란 수열(혹은 문자열)같이 어떤 값의 나열이다.
- R에서는 c( , , , , ) 이렇게 표현한다.
다음 코드는 무슨 뜻이겠는가? 계산 값이 어떻게 나올지 예상해보자.
이제 다음 코드도 이해할 수 있다
1 plot(r, surface)
여기까지가 numeric vector를 이용하여 값을 계산한 후 graph로 출력하는 방법이다.
데이터형
숫자 1(혹은 2, 혹은 3, 혹은 4, 혹은 5....후략)은 세 가지 의미로 해석할 수 있다.
- 숫자 1로서의 의미: 당연히 1 + 1 = 2 가 된다.
- 문자 1로서의 해석: 이 경우 1 + 1 = 11 이 된다. (문자 1에 문자 1을 더함)
- 기호로서의 1: 예를 들어 1학년이라는 뜻으로 1이라고 쓴 경우, 이것은 분류를 위한 기호일 뿐이다. 어떠한 계산도 가능하지 않다.
- 1 대신에 병아리반, 햇님반이라고 해도 무리가 없다. 심지어 문자가 아닌 병아리나 햇님 이모티콘으로 바꿔도 상관없다.
- 이런 경우를 범주형 값(categorical value)라고 하는데 R 세계에서는 factor라고 부른다.
문제는 인간은 이 중 어떤 뜻의 1인지 순식간에 판단을 하지만, 컴퓨터는 이게 안 된다. 인간이 명시해주지 않으면 오류가 생긴다.
변수에 숫자를 그대로 입력하면 R는 numeric 값으로 인식한다. 예: a <- 3
변수에 입력하는 값에 따옴표 (" 혹은 ' 둘 다 가능)를 붙히면 문자(character)로 인식한다. 예: a <- '3'
지금 다루는 값이 범주형(categorical)이라면 factor() 로 명시해준다. 예: a <- factor(3)
다음 코드는 오류를 포함한다. 어떤 오류가 있는가?
iris 데이터의 Species는 범주형(categorical, or factor) vector이다.
1 str(iris$Species)
- 이 값(setosa, versicolor, virginica)은 범주형이 아니고 문자형으로 저장될 수도 있었다.
- 그 때 달라지는 점(유리한 점 or 불리한 점)이 무엇일까...?
data.frame
data.frame은 R에서 가장 많이 쓰는 자료형이다.
- 1개 이상 vector를 모아 놓은 것인데, 언뜻 MS excel의 worksheet와 비슷하게 생겼다.
- Excel sheet는 자료형이 cell 별로 다를 수 있지만, R에서는 vector 별로 같은 자료형이어야 한다.
- 즉 excel에서는 같은 column에서 1번 cell에 이름, 2번 cell에 키, 3번 cell에 몸무게를 입력해도 되지만,
- R에서는 이름 column에는 이름만 문자형 vector로 입력해야 하고, 키는 숫자형 vector로 옆 column에 입력해야 한다.
- 두번째 사람의 이름, 키, 몸무게는 그 다음 줄(row)에 입력한다. 이 각각의 row를 record 혹은 data point라고 부른다.
- 불편해 보일 수 있지만 오류와 실수의 가능성을 줄여주므로 데이타 사이즈가 커질수록 더 편한 방식이다.
data.frame의 예시:
Numeric vector 4개 (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)와 Species vector로 이루어진 data.frame이다.
Species는 문자형(character)가 아니고 분류형(factor) 자료이다. str(iris)로 확인 가능
data.frame 만들기
data.frame()함수로 data.frame을 만들 수 있다.
1 data.frame()
- 결과: data frame with 0 columns and 0 rows 가 만들어진다.
참고로 vector는 c() 이렇게 만든다.
빈 data.frame 대신 내용이 있는 data.frame을 만들어보자.
1 # data.frame의 내용은 vector 입니다.
2 name <- c('Mike','Tim','Jane','Bob','Dylan','Liz')
3
4 # 키와 몸무게는 타이핑이 귀찮으니 sample() 함수로 지정 해 줍시다.
5 # sample() 함수는 주어진 range에서 n개의 숫자를 고르는 역할을 합니다.
6 height <- sample(160:180, 6)
7 weight <- sample(45:80, 6)
8
9 # 성별도 sample() 함수로 지정 해 볼까요? (어차피 가짜 데이타...)
10 sex <- sample( c('M','F'), 6, replace=TRUE)
11 # sampling을 할 모집단으로 c('M', 'F') 을 주었습니다.
12 # replace=TRUE 옵션을 지정하여 중복해서 선택이 가능하도록 했습니다.
13
14 # 준비한 vector들을 하나의 data.frame으로 묶습니다.
15 data.frame(Name = name, Height = height, Weight = weight, Sex=sex)
16
17 # df라는 변수를 준비하여 이 data.frame을 대입합니다.
18 df <- data.frame(Name = name, Height = height, Weight = weight, Sex=sex)
19
20 # 이 과정을 하나의 문장으로 만들 수도 있습니다.
21 df <- data.frame(Name = c('Mike','Tim','Jane','Bob','Dylan','Liz'),
22 Height = sample(160:180, 6),
23 Weight = sample(45:80, 6),
24 Sex = sample( c('M','F'), 6, replace=TRUE)) # 마지막 괄호 닫는 것 잊지 마시길
만든 data.frame을 구경 해 볼까요?
BMI 지수를 계산해서 이 data.frame에 BMI 라는 이름의 vector로 추가 해 봅시다.