본문 바로가기
공부/IT-R프로그래밍

R데이터배우기 - [02] R programming 기초 (자료형과 자료구조)

by 썸볼 2017. 10. 23.

안녕하세요. 무따공입니다 ^^


알프로그래밍 두번째 강의입니다.

무슨 프로그래밍이든 기초가 중요하겠죠? 

자료형과 자료구조에 대해서 살펴볼게요 ~ 

예제를 잘 따라하면서 연습하면 됩니다!! 


1. R programming 기초
(1)
 기본 자료형 (6가지)과 특수한 형태값
1) 6가지 기본 자료형

- 문자형(character) :문자, 문자열
- 수치형(numeric) 
  정수(integer) - 1L, 20L (L부호는 정수형으로 데이터를 저장하도록 R에게 일러준다)
  실수(double) - 1, 20, 3.14, 2.1
- 복소수형(complex) : 실수 + 허수
- 논리형 (logical) : TRUE(T, 1), FALSE(F, 0)

2) 특수한 형태의 값
- NULL : 데이터의 값이 존재하지 않는다는 의미이다.
NA : missing value, 결측값, 손실된값으로 값이 없음을 의미한다.
  하나의 요소의 의미
- NaN(not a number) :수학적으로 정의되지 않은 값
- Inf, -Inf :무한대
- 자료형 확인 함수
   mode(), typeof() : 자료형 확인
- Rstudio -> test 프로젝트 선택 -> File -> New File ->R Script 
  아래 내용을 입력후 Ctrl + Enter로 한줄씩 실행, 결과는 Console에서 확인


mode(1)
mode(1L)
mode(3.24)
mode(1L)
mode(TRUE)
mode('홍길동')
mode(3+4i)
typeof(1)
typeof(2.3)
typeof(1L)
typeof(1)
typeof(TRUE)
typeof('홍길동')
typeof(3+4i)

-------------------------------------
> mode(1)
[1] "numeric"
> mode(1L)
[1] "numeric"
> mode(3.24)
[1] "numeric"
> mode(1L)
[1] "numeric"
> mode(TRUE)
[1] "logical"
> mode('홍길동')
[1] "character"
> mode(3+4i)
[1] "complex"
> typeof(1)
[1] "double"
> typeof(2.3)
[1] "double"
> typeof(1L)
[1] "integer"
> typeof(1)
[1] "double"
> typeof(TRUE)
[1] "logical"
> typeof('홍길동')
[1] "character"
> typeof(3+4i)
[1] "complex"
참고) RStudio console 지우기: CRT + L
참고) 복소수


one <- 100
two <- 90
three <- 80
four <- 70
five <- NA
is.na(five)

x<-NULL
y<-10
is.null(x)
is.null(y)
is.na(NULL)
--------------------------------------------------




(2)자료구조
- 원자벡터(atomic vector)
- 배열(array)

- 행렬(matrix)
- 리스트(list)
- 데이터프레임(data frame)
- 요인(factors)



 1) 원자벡터(Atomic Vectors)
- 벡터가 R에서 가장 일반적이고 기본이 되는 자료구조다. 
- 벡터는 character, logical, integer, numeric을 요소로 갖는 집합(collection)이다.
- 한 벡터 내의 타입은 항상 같아야 한다.
- 벡터를 만드는 가장 간단한 방법이 c()함수 이다.
- 숫자형 데이터인 경우 시작값:끝값 형태와 seq(from,to,by)로 사용이 가능하다.
- seq_along() : 주어진 인자데이터 길이 만큼 1,2,3,...길이까지 벡터로 변환된다.
- seq_leng() : 주어진 인자값까지 1,2,3, ... 인자값까지 벡터로 변환한다.
- rep() :  일정한 패턴들을 반복적으로 사용하여 벡터를 만든다.

x<- c(1,2,3,4,5,6,7,8,9,10)
x

c('1','2','3','4',c('1','2','3','4','5'))

x<-1:10
x
x<-2:9
x
seq(1,10,2)
seq(5,8)

seq_along(c('a','b','c','d')) #1,2,3,4
seq_len(5) #1,2,3,4,5


rep(1:3,5) #req(1:3,time=5) 1:3형식을 5번 반복하여 벡터 생성
rep(1:5, each=3) #1~5까지 각각의 수를 3번씩 반복하여 벡터를 생성

- names()함수로 이름을 부여할 수 있다.
x<-c(1,3,5,7)
names(x)<-c("noh","kim","park","baek")
x #x값 확인


- 벡터의 데이터는 [인덱스]로 요소를 가져온다. 인덱스는 1부터 시작
- 벡터의 여러개의 데이터를 가져오기 위해 벡터의 형식을 사용한다.

x<- c('a','b','c','d')
x[1]
x[4]


x[c(1,3)] #1,3인덱스의 값이 추출된다.
x[c(2,4)] #2,3인덱스이 값
 
x[c(1:3)] #1~3까지 모든인덱스의 값이 추출된다.
x[c(2:4)]
 
- [- ] 음수의 인덱스를 사용하여 특정한 요소를 제거하고 가져온다.
x[-3] #'c'만빼고 x를 가져온다.
x[-1] #'a'만빼고 x를 가져온다.

- 벡터의 길이를 알아내는 함수로는 length(), 
NROW()이다.
  
NROW()는 행렬에서 사용하는 함수이므로 N행 1열로 취급한다.
length(x)
NROW(x) #대문자 사용

- %in%을 사용하여 벡터에 포함된 값을 확인할 수 있다.
'c' %in% c('a','b','c','d') #TRUE
'e' %in% c('a','b','c','d') #FALSE



2) 배열(Array)
- 벡터와 행렬의 값을 나타낸다.
- 한가지 형태의 자료형의 값으로 구성되어 있다.
- 문자와 숫자를 혼합에서 사용하면 에러가 발생한다.
- 1차원 배열은 벡터,  2차원 배열은 행렬이라 한다.
- 3차원 이상의 차원 구조도 가능하다.
- dim은 dimension의 약자로 차원이란 뜻이다.
- length로 배열의 크기를 알 수 있다.
- 배열의 생성은 dim(), array()를 사용한다.  

array(1:20,dim=c(4,5))
array(1:20,dim=c(4,4,3))

array(1:6) 
array(1:6, c(2,3)) 

arr <- c(1:24)                       #1~24의 자료 생성
dim(arr) <- c(3,4,2)                #dim() 함수를 이용하여 3행 4열의 행렬 2개 생성
arr                   


- 같은 크기의 배열간의 사칙연산 및 같은 위치의 원소간의 연산을 수행할 수 있다. 
- 숫자와 배열 또는 배열과 숫자간의 산술 연산도 가능하다.

 ary1 <- array(1:8, dim = c(2,2,2))  
 ary2 <- array(8:1, dim = c(2,2,2))
 ary1
 ary2
 ary1 + ary2
 
ary1 * ary2
 ary1 %*% ary2               #두 배열 원소들의 곱의 합
 sum(ary1 * ary2)           #위의 결과와 같음
?sum                            #sum() 확인

- 배열의 원소를 추출하는 방법은  “,”로 구분하여 차원의 인덱스를 기술하면 된다.
 ary1                             #2행2열2면의 모든 값 출력
 ary1[,,1]                        #1면의 값만 출력
 ary1[1,1,]                      #1면1행1열,2면1행1열 값 출력
 ary1[1,,-2]                     #2면을 제외한 1행의 값
 ary1[,1,-1]                     #1면을 제외한 1열의 값



3) 행렬(matrix)
- 표형식의 데이터를 분석함수를 통해 사용하기 위해 행렬화 해서 사용한다.
- 행렬은 metrix()함수를 이용하여 생성한다.
- 벡터에 차원을 추가하여서도 행렬을 만들수 있다.

a<-1:9
a
dim(a) <- c(3,3)
a


mat1 <- matrix(1:10, nrow=2)      #1~10 2개의 행으로 만든다.
mat1
 
mat2 <- matrix(1:10, ncol = 2)     #1~10 2개의 열로 만든다.
mat2

# 행과 열 이름 주기
names <- list(c("1행", "2행"), c("1열", "2열", "3열"))
 
matrix(1:6, nrow=2, byrow=TRUE, dimnames=names) #행을 우선적으로 만든다.
 
# 벡터 결합에 의한 행렬 만들기
v1 <- c(1, 2, 3, 4)
v2 <- c(5, 6, 7, 8)
v3 <- c(9, 10, 11, 12)
x <- cbind(v1, v2, v3)   #열로 결합
x
 
# 행과 열 이름 주기
rownames(x) <- c("1행", "2행", "3행", "4행")
x
 
colnames(x) <- c("1열", "2열", "3열")
x
 
rbind(v1, v2, v3)       #행으로 결합



4) 리스트(list)
- 여러데이터 타입을 가지는 데이터 구조이다.
- 리스트요소에 이름을 부여할 수 있다.
- list()함수로 리스트를 생성한다.


x <- list("홍길동", "2016001", 20, c("IT융합", "데이터 관리"))
x
 
y <- list("성명"="홍길동", "학번"="2016001", "나이"=20, "수강과목"=c("IT융합",
"데이터 관리"))
y
 
# 동일한 결과
y <- list(성명="홍길동", 학번="2016001", 나이=20, 수강과목=c("IT융합", "데이터 관
리"))
 
# 객체 값의 출력
y["성명"]
 
y[["성명"]]
 
y$성명

 

5) 데이터프레임(data frame)
- 동일한 속성들을 가지는 여러개체들로 구성되며, 각 속성들의 데이터 유형은 서로 다를 수 있다.
- 데이터 프레임은 data.frame() 함수로 생성한다.


# 두 명의 고객 정보에 대한 데이터 프레임 만들기
x <- data.frame(성명=c("홍길동", "손오공"), 나이=c(20, 30), 주소=c("서울", "부산"))
x
 
# 동일한 결과
x <- data.frame("성명"=c("홍길동", "손오공"), "나이"=c(20, 30), "주소"=c("서울", "부산"))
 
# 열과 행 단위 추가
x <- cbind(x, 학과=c("e-비즈", "경영"))
x
 
x <- rbind(x, data.frame(성명="장발장", 나이=40, 주소="파리", 학과="행정"))
x
 
# 요소 값 보기
x[3, 2]
 
x[3,]
 
x[, 2]
 
x[-2,]
 
x["성명"]
 
x$성명
 
x[["성명"]]
 
x[[1]]
 
x[[1]][2]
 
x[1, 2] <- 21
x
 
x[1, "나이"] <- 22
x




6) 요인(factors)
 - R에서 factor(요인)을 범주형 변수(categorical variable)로 취급한다.
 - 아래 gender의 값은 f이고 수준은 m,f  2개이다.
 - m,f는 범주형 변수이다.

gender <- factor("f", c("m","f"))
gender


- 범주의 값을 구한다.
- levels() 함수로 범주의 값을 변경할 수 있다.

levels(gender)[1]
levels(gender)[2]

gender

levels(gender)<- c("male", "female")
gender

- ordered()함수를 이용하여 명목형 변수의 level에 순서를 적용할 수 있다.
- factor()에서는 ordered=TRUE라고 지정한다.

ordered(c("a","b","c","d"))

factor(c('a','b','c','d'), ordered=TRUE)



 
※ 데이터 분류



  - 숫치형 : 숫자로 표현한다, 통계에서는 좀더 중요하다.
  - 범주형 : 문자로 표현한다.
   
  1) 수치형-이산형
    - 셀 수 있으며 정수를 나타낸다.  
    - 값들이 서로 이어져 있지 않다.
    - 예) 1명, 2명, 3명 등 서로 독립적이고 이어져 있지 않다.

  2) 수치형-연속형
   - 데이터가 연속적인 수치값이다.  주로 실수값이다.
   - 예) 175.2cm, 180.12cm 등 키를 나타내는 데이터는 연속형 데이터이다.
   - 175~176사이에는 많은수가 존재한다. 떼어낼 수 없는 독립적이지 않은
     값으므로 연속형이라 한다.

  3) 범주형-명목형
  - 문자형태 이다. 카테고리적 특징을 가진다.
  - 카테고리를 정해 분류한다고 생각할 수 있다.
  - 성별 카테고리, 종교 카테고리, 혈액형 카테고리 등 이안에 값이 담겨져 있다
  - 카테고리는 level이라 부르며, level이 '남', '여' 로 정해졌다면 데이터에
    
['남', '남','여','소녀'] '소녀'가 들어가면 안된다.
  - level은 데이터 생성시 명시할 수 있다.
  - 예)성별(남,여), 종교(기독교, 불교등), 혈액형(O, AB, B, A)
  - 때로는 남,여를 1,2의 숫자로 대신 사용해 통계분석을 하는경우가 있다.
 
  4) 범주형-순서형 
  - 명목형과 비슷하다, 단지 순서가 있다.
  - 예) A+, A-, B+,B-,C+,C-, D+,D-,F 


댓글