오늘은 저번 포스팅에 이어 R에서 자주 쓰이는 데이터타입들과 자료구조를 실습 해 보자
이전글 [빅데이터]-R프로그래밍 #1. 변수, 데이터타입, 함수
# R에서는 보통 선언을 할때 <-를 쓰지만 =도 같은 의미를 하기 때문에 = 를 써주었음
변수 3개를 다음과 같은 데이터를 넣어주었다.
var1 = 5
var2 = '5'
var3 = "2000-01-01"
print(class(var1))
print(class(var2))
print(class(var3))
저번포스팅에서 R은 데이터를 변수에 저장될때 동적타이핑이 되어 데이터 타입이 저장된다고 배웠다.
결과를 보면 다음과 같이 데이터 타입이 지정이 된것을 볼 수 있다.
·class()함수는 ()안에 있는 데이터의 타입을 출력해주는 함수
"2000-01-01" 데이터를 var3변수에 담을때 날짜 형식으로 담고 싶었으나 문자열 형식으로 담아진 것을 볼 수 있다.
> print(class(var1))
[1] "numeric"
> print(class(var2))
[1] "character"
> print(class(var3))
[1] "character"
이럴 때 쓰는 함수가 as함수이다.
as메소드는 R에서 데이터 타입을 변환할 때 사용되는 함수이다.
var3 = as.Date(var3)
print(class(var3))
다음과 같이 데이터타입이 문자열(character)에서 날짜(Date)형식으로 바뀐것을 알 수 있다.
> var3 = as.Date(var3)
> print(class(var3))
[1] "Date"
as.Date 말고도 다른 형식으로 변환이 가능하다.
·as.numeric() : 숫자형으로 변환
·as.character() : 문자열로 변환
·as.logical() : 논리형으로 변환
·as.factor() : 팩터(범주)형으로 변환
이 뿐만아니라 리스트, 매트릭스 등으로도 변환이 가능
이를 이용하여 숫자형인var1의 데이터타입을 바꾸어 보았다
var1 = as.character(var1)
print(class(var1))
var1 = as.numeric(var1)
print(class(var1))
var1 = as.logical(var1)
print(class(var1))
출력결과
> var1 = as.character(var1)
> print(class(var1))
[1] "character"
>
> var1 = as.numeric(var1)
> print(class(var1))
[1] "numeric"
>
> var1 = as.logical(var1)
> print(class(var1))
[1] "logical"
이제 여러 데이터를 담을수 있는 vector, matrix, array, list, data frame을 알아보자
###참고사항
· vector, matrix, array는 들어가는 데이터의 유형이 같아야 한다는 특징이 있다.
· R에서는 인덱스 시작점이 0이아닌 1이다.
1. vector형 : 동일한 데이터 타입이 일렬로 모인 1차원 배열
·is.vector(ex1) 함수는 ex1이 벡터타입이면 True를 출력하고 아니면 False를 출력
is 함수를 이용하여 다른 데이터도 타입확인이 가능하다.
·c()함수는 combine(결합)의 줄임말로 여러개의 값을 하나의 벡터로 묶어주는 역할
ex1 = c(1,2,3,4,5)
ex2 = c("일","이","삼","사","오")
print(class(ex1))
print(is.vector(ex1)) #ex1이 벡터타입인지 확인
ex1
ex1[2]
ex2[2]
출력결과
> ex1 = c(1,2,3,4,5)
> ex2 = c("일","이","삼","사","오")
>
> print(class(ex1))
[1] "numeric"
> print(is.vector(ex1)) #ex1이 벡터타입인 확인
[1] TRUE
>
> ex1
[1] 1 2 3 4 5
>
> ex1[2]
[1] 2
> ex2[2]
[1] "이"
2. matrix형 : 동일한 데이터 타입의 값들이 행과 열로 구성된 2차원 배열, 2차원 행렬이라고 생각할 수 있다.
·c함수 안에있는 1:20 는 1부터 20까지 생성하라는 의미
·nrow는 행의 개수를 지정해 주는 것이다. ncol로는 열의 개수를 지정해 줄 수 있다.
간단하게 슬라이싱(slicing)도 해보았다.
슬라이싱이란 데이터의 원하는 부분을 선택하는 기술이고, 데이터분석에서 자주 쓰이는 용어
mat1 = matrix(c(1:20), nrow=4)
print(mat1)
mat1[c(1,3), c(2,3)] #1행과 3행의 2열과 3열요소 선택
mat1[, c(2,3)] #행위치 빈칸이면 모든행을 의미
mat1[c(1,3), ] #열위치 빈칸이면 모든열을 의미
출력결과
> print(mat1)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
>
> mat1[c(1,3), c(2,3)] #1행과 3행의 2열과 3열요소 선택
[,1] [,2]
[1,] 5 9
[2,] 7 11
> mat1[, c(2,3)] #행위치 빈칸이면 모든행을 의미
[,1] [,2]
[1,] 5 9
[2,] 6 10
[3,] 7 11
[4,] 8 12
> mat1[c(1,3), ] #열위치 빈칸이면 모든열을 의미
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 3 7 11 15 19
3. array형 : 다차원 배열로, 매트릭스의 확장판, 동일한 데이터 타입의 값들이 여러 차원에 걸쳐있음
dim이라는 설정으로 배열의 가로, 세로, 높이를 설정해 줄 수 있다.
array1 = array(c(1:12), dim=c(2,2,3)) #dim = c(가로,세로,높이)
print(array1)
print(array1[1, 1, 1]) #array이름[행번호, 열번호, 높이번호]
print(array1[1, 2, 1])
print(array1[1, 1, 2])
출력결과
> print(array1)
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 11
[2,] 10 12
> print(array1[1, 1, 1]) #array이름[행번호, 열번호, 높이번호]
[1] 1
> print(array1[1, 2, 1])
[1] 3
> print(array1[1, 1, 2])
[1] 5
4. list형 : 앞서 알려준 배열들은 데이터의 유형이 같아야 한다는 특징이 있지만 리스트는 다르다.
리스트 안에는 벡터, 매트릭스, 다른 리스트 등 다양한 형태의 데이터 타입의 값들을 포함할수 있는 자료구조이다.
list1 = list(학번=1001, 이름='홍길동', 생일='1997-10-18')
print(list1)
출력결과
> print(list1)
$학번
[1] 1001
$이름
[1] "홍길동"
$생일
[1] "1997-10-18"
또한 리스트는 다양하게 데이터를 저장이 가능하며 $연산자를 이용해 특정 요소 접근이 가능하다.
list2 = list( 소대1 = c('홍길동', '전우치', '일지매'),
소대2 = c('강감찬', '이순신', '유관순'),
소대3 = c('김구', '김유신', '을지문덕') )
print(list2)
print(list2$소대1)
출력결과
> print(list2$소대1)
[1] "홍길동" "전우치" "일지매"
5. data frame(데이터 표) : 각 열은 동일한 데이터 타입을 가지며, 각 행은 다양한 데이터 타입을 가질 수 있는 2차원 테이블로 행렬의 확장판이다.
다음 코드는 원래 있던 3개의 벡터를 가지고 하나의 data frame을 만들었다.
그리고 리스트와 마찬가지로 $ 연산자를 이용해 요소에 접근할 수 있다.
no = c(1,2,3)
hno = c("일","이","삼")
name= c("홍길동", "전우치", "일지매")
df1 = data.frame(NO=no,HNO=hno,NAME=name)
print(df1)
print(df1$NAME)
출력결과
> print(df1)
NO HNO NAME
1 1 일 홍길동
2 2 이 전우치
3 3 삼 일지매
> print(df1$NAME)
[1] "홍길동" "전우치" "일지매"
마치며
이와 같이 오늘은 R에서 자주쓰이는 변수할당 방법과 자료구조에 대해 알아보고 실습해 보았다.
Array와 List처럼 이름이 같은 자료구조여도 다른 프로그래밍 언어에서 썼을 때와 세심하게 다른 부분이 많았던것 같다.
앞으로도 그 점에 유의해서 R프로그래밍을 공부해야할 것 같다.
'빅데이터' 카테고리의 다른 글
[빅데이터]-R프로그래밍 #1. 변수, 데이터타입, 함수 (0) | 2024.07.08 |
---|---|
[빅데이터] 빅데이터 분석을 위한 R설치 및 프로그래밍 (0) | 2024.07.08 |