목차

[02] R programming (자료형, 자료구조)

1. R programming

(1)기본 자료형과 특수한 형태값

1) 연속 변수와 범주 변수

① 이산형 : Integer

② 연속변수 : Numeric

③ 범주 변수 : Factor

snippet.r
gender = factor("f", c("m","f"))
gender
snippet.r
levels(gender)[1]
levels(gender)[2]
 
gender
 
levels(gender)<- c("male", "female")
gender
snippet.r
ordered(c("a","b","c","d"))
 
factor(c('a','b','c','d'), ordered=TRUE)
 
 
var1 <- c(1,2,3,1,2) #numeric 변수 생성
 
var2 <- factor(c(1,2,3,1,2)) #factor변수 생성
 
var1 # #numeric 변수 출
 
[1] 1 2 3 1 2
 
var2 # factor 변수 출력
 
[1] 1 2 3 1 2
Levels: 1 2 3  
snippet.r
var1 + 2 #numeric 변수 연산
 
[1] 3 4 5 3 4
 
var2 + 2 #factor 변수 연산
 
1] NA NA NA NA NA
Warning message:
In Ops.factor(var2, 2) : 요인(factors)에 대하여 의미있는 ‘+’가 아닙니다.
snippet.r
class(var1)
 
[1] "numeric"
 
 class(var2)
 
[1] "factor"

- factor 변수의 구성 범주 확인하기

snippet.r
levels(var1)
 
NULL
 
levels(var2)
 
[1] "1" "2" "3"

- 문자로 구성된 factor 변수

snippet.r
var3 <- c("a","b","b","c")   #문자변수 생성
 
 var4 <- factor(c("a","b","b","c")) #문자로 된 factor 변수 생성
 
 var3
 
[1] "a" "b" "b" "c"
 
var4
 
[1] a b b c
Levels: a b c
 
class(var3)  #var3변수 타입확인
 
[1] "character"
 
class(var4) #var4변수 타입확인
 
[1] "factor"

2) 변수 타입 바꾸기

mean(var1) #var1 변수 데이터 평균 구하기

[1] 1.8

mean(var2) #var2 변수 데이터 평균 구하기 → factor 타입은 평균을 구할 수 없다

[1] NA
Warning message:
In mean.default(var2) :

인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다

# factor 타입을 numeric타입으로 변환
var2 ← as.numeric(var2)

mean(var2) #평균구하기
[1] 1.8

4) 특수한 형태의 값

snippet.r
mode(1)
mode(1L)
mode(3.24)
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
- 참고) 복소수

snippet.r
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)자료구조  
 
- 벡터(vector)
- 배열(array)
- 행렬(matrix)
- 리스트(list)
- 데이터프레임(data frame)
 
#### 1) 벡터(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) #rep(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 

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

snippet.r
 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                   
snippet.r
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)

snippet.r
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 객체 생성

snippet.r
x <- list("홍길동",
           "2016001",
            20,
           c("IT융합", "데이터 관리"))
> x
[[1]]
[1] "홍길동"
 
[[2]]
[1] "2016001"
 
[[3]]
[1] 20
 
[[4]]
[1] "IT융합"      "데이터 관리"
 
 
x[[1]]
 
x[1]
snippet.r
> x = unlist(x)
> x
[1] "홍길동"      "2016001"     "20"          "IT융합"     
[5] "데이터 관리"
snippet.r
y <- list("성명"="홍길동",
           "학번"="2016001",
           "나이"=20,
           "수강과목"=c("IT융합","데이터 관리"))
 
y
 
# 동일한 결과
y <- list(성명="홍길동",
           학번="2016001",
           나이=20,
           수강과목=c("IT융합", "데이터 관리"))
 
 
# 객체 값의 출력
> y["성명"]
$성명
[1] "홍길동"
 
> y$성명
[1] "홍길동"
> 
> y[[2]]
[1] "2016001"
> y[2]
$학번
[1] "2016001"
 
> y$수강과목
[1] "IT융합"      "데이터 관리"
> 
> y$수강과목[1]
[1] "IT융합"
> y$수강과목[2]
[1] "데이터 관리"
 
> length(y)      #y리스트의 갯수
[1] 4
 
> mode(y); class(y)     #y리스트의 자료형과 자료구조
[1] "list"
[1] "list"

② List 객체의 자료처리 함수

snippet.r
a = list(c(1:5))
b = list(6:10)
a;b
 
> lapply(c(a,b),max)
[[1]]
[1] 5
 
[[2]]
[1] 10
 
> sapply(c(a,b),max)
[1]  5 10

③ 다차원 리스트 객체 생성

snippet.r
multi_list = list(c1=list(1,2,3),
                  c2=list(10,20,30),
                  c3=list(100,200,300))
 
> multi_list$c1; multi_list$c2; multi_list$c3
[[1]]
[1] 1
 
[[2]]
[1] 2
 
[[3]]
[1] 3
 
[[1]]
[1] 10
 
[[2]]
[1] 20
 
[[3]]
[1] 30
 
[[1]]
[1] 100
 
[[2]]
[1] 200
 
[[3]]
[1] 300
snippet.r
# 두 명의 고객 정보에 대한 데이터 프레임 만들기
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["성명"]
 
x$성명

※ 혼자서 해보기 ※

Q1 다섯명의 학생 시험점수를 담고 있는 변수를 만드시오.

Q2 전체 평균구하시오.(mean())

Q3 전체 평균 변수 만들고 출력하시오.

Q4 다음과 같은 벡터 객체를 생성하시오.
조건1) 벡터 변수 Vec1을 만들고, “R” 문자가 5회 반복되도록 하시오.
조건2) 벡터 변수 Vec2에 1~10까지 3간격으로 연속된 정수를 만드시오.
조건3) 벡터 변수 Vec3에 1~10까지 3간격으로 연속된 정수가 3회 반복되도록 만드시오.
조건4) 벡터 변수 Vec4에는 Vec2~Vec3가 모두 포함되는 벡터를 만드시오.
조건5) 25 ~ -15까지 5를 간격으로 seq() 함수를 이용하여 벡터를 생성하시오. (첨자이용)



관련 문서