Chapter 3 R for Beginners (W2-2)

3.1 Data Structure

데이터 구조에 대해 알아보자.

  • 차원이란 무엇인가? 사물을 보는 입장
    • 벽돌 한개의 위치를 표현하기 위해 몇개의 좌표가 필요한가? (x, y, z)
    • 모서리를 찾아서 x축, y축, z축을 그려보면 된다
  • Vector는 몇차원인가? Matrix는? 그럼 Array는?
    • Vector는 행(rows) or 열(columns)
    • Matrix는 행 x 열
    • 즉 Vector는 1차원 Array, Matrix는 2차원 Array
Data Structure

Figure 3.1: Data Structure

  • 동일한 데이터형 (ex. 1,2,3,4,5)만 담을 수 있는 것
    • Vector, Matrix, Array
  • 혼합된 데이터형 (ex. 1,2,삼,4,5)을 담을 수 있는 것
    • List, Data Frame

3.1.1 Variable

변수(variable)란 무엇인가?

  • 상징적인 의미 (이름)로 숫자에 이름을 지어주는 것
  • Vary + able = 상황에 따라 변할 수 있는 것을 말함
  • 예)
    • 오늘의 시점에서 오늘의 날씨는 27도
    • 내일이 되면 오늘의 날씨는 25도가 될 수 있다
      • 날씨는 숫자이므로 이름을 지어줌
      • 오늘의 날씨은 내일 바뀔 수 있다.
      • 그러므로 코딩에서 오늘의 날씨를 지칭할 때 TodayWeather, todayweather, weathertoday 라는 식으로 본인이 기억하기 쉽게 정의를 할 수 있다

변수 만들때 유의

  • 대소문자 구분
  • 영어와 숫자를 쓸수 있지만, 영어로 시작해야 함 (ex. PhoneNum1)
  • R에서 이미 사용하는 예약어 사용 불가 (ex. break, ease, FALSE, for function, next…)

변수(Variable)에 데이터 담기

a <- 111    #a라는 변수에 111을 담기 (많이 사용함) 
222 -> a    #b라는 변수에 222를 담기
a = 333     #c라는 변수에 333을 담기

변수(Variable) 정의 및 출력

a <- 111
a  #a 출력
## [1] 111
a <- 222
a  #a 출력
## [1] 222
a = 333
a  #a 출력
## [1] 333
  • 잘못된 변수 정의
    • a -> 444
    • 555 = a

변수를 여러번 정의를 하면?

a <- 111  #a = 111
a <- 222  #a = 222
a  #a를 출력하면 맨 마지막에 정의한 것으로 출력됨
## [1] 222

3.2 Vector

  • 벡터는 한가지 유형의 데이터만 담을 수 있다 (ex. 문자만 아니면 숫자만)
  • Create (생성): c() 함수는 combine value라는 의미로 여러 값을 한번에 처리

vector1에 숫자형 1, 2, 3, 4 를 담아보자

vector1 <- c(1,2,3,4)     
vector1 #vector1 출력
## [1] 1 2 3 4
is.vector(vector1)  #벡터인지 확인
## [1] TRUE

vector2에 숫자와 문자를 같이 담아보자

vector2 <- c(1,2,3,'Seoul')     
vector2 #vector1 출력
## [1] "1"     "2"     "3"     "Seoul"
is.vector(vector2) #벡터인지 확인
## [1] TRUE
  • 숫자와 문자가 담겼지만 벡터라고 한다
  • 이유는…따옴표가 생기며 숫자 1, 2, 3, 4를 문자로 변환시켰다

평균 출력

vector1 <- c(1,2,3,4) # vector1을 1,2,3,4를 할당
mean(vector1)         # vector1의 평균 출력
## [1] 2.5

Strings

vector2 <- c("a", "b", "c", "d")
mean(vector2)  # 알파벳 문자들로 평균을 낼 수 없으니, NA 에러 출력(NA = Not Available)
## Warning in mean.default(vector2): argument is not numeric or logical:
## returning NA
## [1] NA

3.2.1 Vector as a set

Vector as a set: 벡터 세트

union: 합집합

vector1 <- c(1,2,3)
vector2 <- c(2,4,5)
union(vector1, vector2)
## [1] 1 2 3 4 5

intersect: 교집합

vector1 <- c(1,2,3)
vector2 <- c(2,4,5)
intersect(vector1, vector2)
## [1] 2

setdiff (차집합 개념)

  • vector1 - vector2
  • (1,2,3) - (2,4,5) = (1,3)
vector1 <- c(1,2,3)
vector2 <- c(2,4,5)
setdiff(vector1, vector2)
## [1] 1 3

setequal (set가 equal 한가?)

vector1 <- c(1,2,3)
vector2 <- c(2,4,5)
setequal(vector1, vector2)
## [1] FALSE

3.2.2 Vector Operation

벡터 연산

x <-c(1,2,3)
x + 1
## [1] 2 3 4
3 - x
## [1] 2 1 0

Identical

vector1 <- c(1,2,3)
vector2 <- c(2,4,5)
identical(vector1, vector2)   #vector 1 is not same with vector 2
## [1] FALSE
vector1 <- c(1,2,3)
2 %in% vector1   #2가 vector1에 있는가? 
## [1] TRUE
5 %in% vector1   #5가 vector1에 있는가?
## [1] FALSE

3.3 Matrix

  • 행렬(Matrix)
    • 행(세로=row) * 열(가로=column)
    • 왼쪽, 세로부터 시작

matrix(): 옵션없이 출력

a <- matrix(c(1,2,3,4))
a   #출력
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
## [4,]    4

nrow (number of rows): 세로 (행)의 수를 지정

a <- matrix(c(1,2,3,4,5,6),nrow=3)
a   #출력
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

ncol (number of columns): 가로 (열)의 수를 지정

a <- matrix(c(1,2,3,4,5,6),ncol=3)
a   #출력
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

데이터 조회

a <- matrix(c(1,2,3,4,5,6),nrow=3)
a[,1] #모든 행의 1열을 출력
## [1] 1 2 3
a[1,] #1행의 모든 열 출력
## [1] 1 4

byrow: 가로의 순서로

a <- matrix(c(1,2,3,4,5,6),nrow=3,byrow=T)   #T = True
a   #출력
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6

행과 열에 라벨설정

a <- matrix(c(1,2,3,4,5,6),nrow=3,byrow=T)   #T = True
colnames(a) <- c("1열","2열")                # set matrix column names
rownames(a) <- c("1행","2행","3행")          # set matrix row names
a
##     1열 2열
## 1행   1   2
## 2행   3   4
## 3행   5   6

새로운 행추가: rbind()

a <- matrix(c(1,2,3,4,5,6),nrow=3,byrow=T)   #T = True
a   #출력
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
a <- rbind(a,c(7,8))
a   #새로운 행이 추가되었는지 확인
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8

새로운 열추가: cbind()

a <- matrix(c(1,2,3,4,5,6),nrow=3,byrow=T)   #T = True
a   #출력
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
a <- cbind(a,c(7,8,9))
a   #새로운 행이 추가되었는지 확인
##      [,1] [,2] [,3]
## [1,]    1    2    7
## [2,]    3    4    8
## [3,]    5    6    9

3.4 Array

  • 배열(array)은 차원(dimension)의 개념이다
  • 차원은 사물을 보는 입장

array(): 배열

a <- array(c(1:12))
a   #출력
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
a <- array(c(1:12), dim=c(4:3)) #1-12까지의 수를 vector를 4x3으로 dimension으로 저장
a   # 출력
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12
a <- array(c(1:12), dim=c(2,3,3)) #2x3를 3번
a   #출력
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    7    9   11
## [2,]    8   10   12
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
a <- array(c(1:12), dim=c(3,2,4)) #3x2를 4번
a   #출력
## , , 1
## 
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
## 
## , , 2
## 
##      [,1] [,2]
## [1,]    7   10
## [2,]    8   11
## [3,]    9   12
## 
## , , 3
## 
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
## 
## , , 4
## 
##      [,1] [,2]
## [1,]    7   10
## [2,]    8   11
## [3,]    9   12

3.5 List

리스트

a <- list(name='Kim', phone='010-1234-5678', location='Seoul')
a   #출력
## $name
## [1] "Kim"
## 
## $phone
## [1] "010-1234-5678"
## 
## $location
## [1] "Seoul"

골라서 출력

a$name   #a에서 name만 출력
## [1] "Kim"

요소 추가

a <- list(name='Kim', phone='010-1234-5678', location='Seoul') 
a$age <- '27' #나이를 추가
a   #출력
## $name
## [1] "Kim"
## 
## $phone
## [1] "010-1234-5678"
## 
## $location
## [1] "Seoul"
## 
## $age
## [1] "27"

요소 삭제 (NULL)

a <- list(name='Kim', phone='010-1234-5678', location='Seoul', age='27') 
a$age <- NULL #나이를 삭제
a   #출력
## $name
## [1] "Kim"
## 
## $phone
## [1] "010-1234-5678"
## 
## $location
## [1] "Seoul"

3.6 Data Frame

  • 데이터가 한가지 유형 (숫자, 문자)의 경우는 array와 matrix를 사용하면 되지만 실제로 데이터는 여러가지 유형이 섞여있거나, 합쳐서 분석해야 함
  • 그러므로 여러 유형을 담을 수 있는 데이터 프레임을 사용해야 함
  • 데이터프레임에서 column은 label(라벨)이라고 함

Vector를 Data frame으로 담기

name <- c("Kim", "Lee", "Park")
city <- c("Seoul", "Pusan", "Buchen")
age <- c(23, 24, 22)
df_students <- data.frame(StudentName = name, CityName = city, 
    Age = age)  #라벨을 설정헤서 #df_students라는 데이터프레임에 담기
df_students  #df_students 데이터프레임 출력
##   StudentName CityName Age
## 1         Kim    Seoul  23
## 2         Lee    Pusan  24
## 3        Park   Buchen  22

Matrix를 Data frame으로 담기

students <- matrix(c("1", "Kim", "Seoul", "23", "2", "Lee", 
    "Pusan", "24", "3", "Park", "Puchen", "22"), nrow = 3, 
    byrow = T)
df_students <- data.frame(students)  #라벨없이
names(df_students) <- c("Number", "StudentName", "CityName", 
    "Age")  #라벨지정 names()
df_students
##   Number StudentName CityName Age
## 1      1         Kim    Seoul  23
## 2      2         Lee    Pusan  24
## 3      3        Park   Puchen  22

Data frame에서 원하는 데이터 조회: 변수$라벨명

students <- matrix(c("1", "Kim", "Seoul", "23", "2", "Lee", 
    "Pusan", "24", "3", "Park", "Puchen", "22"), nrow = 3, 
    byrow = T)
df_students <- data.frame(students)  #라벨없이
names(df_students) <- c("Number", "StudentName", "CityName", 
    "Age")  #라벨지정 names()
df_students[2, 3]  #2x3에 있는 요소 가져오기
## [1] Pusan
## Levels: Puchen Pusan Seoul