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
- 동일한 데이터형 (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