7/23 (월) 41차시

R

뉴질랜드 aukland 대학의 ross lhaka, robert clifford gentleman이 1995년에 개발한 소프트웨어이고 데이터 분석을 위한 통계 및 그래픽스를 지원하는 무료 소프트웨어이다.

R을 사용해야하는 이유

  1. R은 무료 소프트웨어
  2. 데이터 분석을 위해 가장 많이 사용되는 통계 플랫폼
  3. 복잡한 데이터를 다양한 그래프로 표현할 수 있다.
  4. 분석을 위한 데이터를 쉽게 저장하고 조작할 수 있다.
  5. 누구든지 유용한 패키지를 생성해서 공유 할 수 있고,
    새로운 기능에 대한 전달이 빠르다.
  6. OS에 제한을 받지 않는다=어떤 OS에서도 설치할 수 있다.

변수

  1. 변수 이름은 알파벳, 숫자, _, .(마침표)를 사용한다.
  2. 변수 이름의 첫 글자는 알파벳, 마침표로 시작할 수 있다.
  3. 마침표로 시작하는 경우에는 바로 뒤에 숫자를 입력할 수 없다. 예)변수명으로 가능 :a, i, x2, .y 변수명으로 불가능 :1a, .2, k-j

변수에 값 할당 연산자(<-, <<-, =)

x<-1
x
## [1] 1
print(x)
## [1] 1
y<<-1
y
## [1] 1
print(y)
## [1] 1
z=3
z
## [1] 3
print(z)
## [1] 3
x+y+z
## [1] 5
sum(x<-c(1,2,3,4,5))
## [1] 15
x
## [1] 1 2 3 4 5
#x의 global 변수화
sum(y=c(1,2,3,4,5))
## [1] 15
y #이 경우 sum에 대해서 오류가 나지는 않으나 y 값은 지정한 1, 2, 3, 4, 5로 출력되지 않고 위에서 정했던 값인 1이 나온다
## [1] 1
sum(d=c(1,2,3,4,5))
## [1] 15
sum(f100=c(1,2,3,4,5))
## [1] 15
sum(f100<-c(1,2,3,4,5))
## [1] 15
f100
## [1] 1 2 3 4 5
#함수 내부에서만 사용할 변수라면 =(equal)을 사용해도 되나 함수 외에서도 사용할거라면 <-를 사용해 전역(global)변수화 해준다.

숫자(정수, 실수)

x<-2
print(x)
## [1] 2
class(x)
## [1] "numeric"
y<-2L
print(y)
## [1] 2
class(y)
## [1] "integer"
#r은 기본적으로 실수(numeric) 표현을 한다. 만일 정수 표현(integer)이 필요한 경우 뒤에 대문자 L을 붙여준다. 
z<-x+y
print(z)
## [1] 4
class(z)
## [1] "numeric"
str(z)
##  num 4
is.numeric(z)
## [1] TRUE
is.integer(y)
## [1] TRUE
#is.numeric/integer() =boolean형식으로 만약 괄호 안 값이 조건에 일치되면 true, 일치되지 않으면 false 출력

문자열

s1<-'hello'
s1
## [1] "hello"
class(s1)
## [1] "character"
s2<-"안녕하세요"
s2
## [1] "안녕하세요"
class(s2)
## [1] "character"
is.character(s1)
## [1] TRUE

boolean(진리값)형식 : and(&), or( | )

TRUE & TRUE
## [1] TRUE
TRUE & FALSE
## [1] FALSE
TRUE | TRUE
## [1] TRUE
TRUE | FALSE
## [1] TRUE
#이렇게도 표현 가능 :T&T / T&F / T|T / T|F
T<-TRUE
T
## [1] TRUE
class(T)
## [1] "logical"
is.logical(T)
## [1] TRUE
F<-FALSE
F
## [1] FALSE

NA(Not Available) :결측(치)값, 데이터 입력 중 실수로 값이 입력되지 않은 경우

a<-100; b<-90; c<-NA
a; b; c
## [1] 100
## [1] 90
## [1] NA
a+b+c
## [1] NA
is.na(c)
## [1] TRUE

NULL :변수에 초기값이 없는 경우 사용. undefind값을 표현

x<-NULL
x
## NULL
is.null(x)
## [1] TRUE
is.na(x)
## logical(0)
y<-100
x+y
## numeric(0)
z<-NA
z+y
## [1] NA
#NA는 NULL과는 다르다. NA는 하나의 값으로 인식하는 반면, NULL은 아예 값 자체가 없는 경우.

산술연산자

1+2
## [1] 3
100-99
## [1] 1
99-100
## [1] -1
2*3
## [1] 6
100/2
## [1] 50
100/3
## [1] 33.33333
100%/%3 #몫만 출력
## [1] 33
100%%3  #나머지만 출력
## [1] 1
10^2    #in oracle :power(10,2)
## [1] 100
10**2
## [1] 100

비교연산자

10>5
## [1] TRUE
10<5
## [1] FALSE
10>=5
## [1] TRUE
10<=5
## [1] FALSE
10!=5
## [1] TRUE
10==5
## [1] FALSE
10>9 & 10>=10
## [1] TRUE
10<9 | 10>=10 #or은 두 조건 중 하나만 참이어도 참
## [1] TRUE

숫자 :지수표기법

1e2   #(1*10^2)
## [1] 100
5e-1  #(5*10^(-1))
## [1] 0.5
5e-2  #(5*10^(-2))
## [1] 0.05
10000 #숫자가 커지면 자동으로 지수꼴 전환을 통해 출력한다.
## [1] 10000

자료형

1. vector(벡터)

-같은 데이터 타입을 갖는 1차원 배열구조(R의 기본 데이터 구조)
-c( ) :combine value
-벡터는 중첩이 불가능하다.
-벡터는 단일 데이터 타입만 가능하다
-데이터 변환 규칙(우선순위) :integer<double<character

x<-c(1,2,3,4,5)
x
## [1] 1 2 3 4 5
mode(x)
## [1] "numeric"
class(x)
## [1] "numeric"
str(x)
##  num [1:5] 1 2 3 4 5
x<-c(1,2,3,4,'5')
x
## [1] "1" "2" "3" "4" "5"
mode(x)
## [1] "character"
class(x)
## [1] "character"
str(x)
##  chr [1:5] "1" "2" "3" "4" "5"
#character형이 integer형보다 우선순위가 높기 때문에 벡터값 하나만 문자형이어도 전부 문자형으로 변환된다
x<-c(1, 2, 3.14, 4, 5)
x
## [1] 1.00 2.00 3.14 4.00 5.00
mode(x)
## [1] "numeric"
class(x)
## [1] "numeric"
str(x)
##  num [1:5] 1 2 3.14 4 5
#double형이 integer형보다 우선순위가 높기 때문에 벡터값 하나만 실수형이어도 전부 실수형으로 변환된다
x<-c(1,2,3,c(4,5))
x
## [1] 1 2 3 4 5
s1<-c('서울', '광주', '대구', '부산')
mode(s1)
## [1] "character"
class(s1)
## [1] "character"
str(s1)
##  chr [1:4] "서울" "광주" "대구" "부산"
x<-c(1,2,3, sum=c(4,5))   #sum이 컬럼명이 된다
y<-c(1,2,3, sum(c(4,5)))  #sum한 값이 출력
x; y
##                sum1 sum2 
##    1    2    3    4    5
## [1] 1 2 3 9
x<-c("국어"=90, "수학"=95, "영어"=80) #각 항목이 컬럼 명이 된다
x
## 국어 수학 영어 
##   90   95   80
z<-c("과목"=c(80,90,96))      #각 과목이라는 컬럼 아래 80, 90, 96이 입력
z
## 과목1 과목2 과목3 
##    80    90    96
names(z)<-c("국어", "영어", "수학")   #z의 각 이름을 combine변수 값으로 바꾸겠다
z
## 국어 영어 수학 
##   80   90   96
names(z)<-NULL  #컬럼 명 삭제
z
## [1] 80 90 96
y<-c(1,2,3,4,5)
y
## [1] 1 2 3 4 5
names(y)<-c("하나", "둘", "셋", "넷", "다섯")
y
## 하나   둘   셋   넷 다섯 
##    1    2    3    4    5
length(y)
## [1] 5

벡터의 요소번호를 이용하는 방법

y[1]    
## 하나 
##    1
y[2]
## 둘 
##  2
y[1:3]                  #1부터 3까지의 요소를 출력
## 하나   둘   셋 
##    1    2    3
y[c(-1,-3)]           #특정 요소를 제외시킴
##   둘   넷 다섯 
##    2    4    5
y["하나"]               #셀의 이름으로도 확인 가능
## 하나 
##    1
y[c("하나", "다섯")]    #특정 요소만을 출력
## 하나 다섯 
##    1    5
y[-1:-4]                  #1번 요소부터 4번 요소까지 전부 제외시킴
## 다섯 
##    5
#names( ) :벡터의 각 셀에 이름을 설정
#length( ) :벡터의 길이

연속되는 값을 표현하는 방법

x<-1:100
x<-c(1:1000)    #c(시작값:종료값)

seq(1, 5, 1)    #1부터 5까지 1씩 증가
## [1] 1 2 3 4 5
seq(0, 1000, 5) #0부터 1000까지 5씩 증가
##   [1]    0    5   10   15   20   25   30   35   40   45   50   55   60   65
##  [15]   70   75   80   85   90   95  100  105  110  115  120  125  130  135
##  [29]  140  145  150  155  160  165  170  175  180  185  190  195  200  205
##  [43]  210  215  220  225  230  235  240  245  250  255  260  265  270  275
##  [57]  280  285  290  295  300  305  310  315  320  325  330  335  340  345
##  [71]  350  355  360  365  370  375  380  385  390  395  400  405  410  415
##  [85]  420  425  430  435  440  445  450  455  460  465  470  475  480  485
##  [99]  490  495  500  505  510  515  520  525  530  535  540  545  550  555
## [113]  560  565  570  575  580  585  590  595  600  605  610  615  620  625
## [127]  630  635  640  645  650  655  660  665  670  675  680  685  690  695
## [141]  700  705  710  715  720  725  730  735  740  745  750  755  760  765
## [155]  770  775  780  785  790  795  800  805  810  815  820  825  830  835
## [169]  840  845  850  855  860  865  870  875  880  885  890  895  900  905
## [183]  910  915  920  925  930  935  940  945  950  955  960  965  970  975
## [197]  980  985  990  995 1000
#sequence :자동일련번호를 생성
10:1        #reverse
##  [1] 10  9  8  7  6  5  4  3  2  1
seq(10,0,-1)    #10부터 0까지 -1씩 감소
##  [1] 10  9  8  7  6  5  4  3  2  1  0
x<-c(2,4,6,8,10)
x
## [1]  2  4  6  8 10
seq_along(x)    #x의 변수 길이만큼 seqence하게 값을 생성
## [1] 1 2 3 4 5
1:NROW(x)   #1부터 x의 길이만큼 값을 생성
## [1] 1 2 3 4 5
rep(1:5, times=2)   #1부터 5까지 나열 후 동일하게 나열 반복
##  [1] 1 2 3 4 5 1 2 3 4 5
rep(1:5, each=2)    #1부터 5까지 각 값을 두 번씩 반복
##  [1] 1 1 2 2 3 3 4 4 5 5
rep(1:5, times=2, each=2)
##  [1] 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5

벡터의 값을 수정하는 방법

x<-c(1:5)
x[2] <-8        #특정한 위치의 벡터값을 수정하고자 할 때
x[3:5]<-c(10, 11, 12)

벡터의 값을 추가하는 방법

x[6]<-60
x[8]<-80
x[7]<-70


append(x,90,after=8)    #데이터가 직접 추가되지 않음
## [1]  1  8 10 11 12 60 70 80 90
x
## [1]  1  8 10 11 12 60 70 80
x<-append(x,90,after=8) #이렇게 작성해야 x에 추가됨
x
## [1]  1  8 10 11 12 60 70 80 90
x<-append(x,100,after=5)
x
##  [1]   1   8  10  11  12 100  60  70  80  90
#append(, , before)(X) :before는 존재하지 않음
#벡터(위치)<-값 은 위치에 값이 존재하지 않을 때 사용하는 것이 좋고
  이미 존재하는 값들 사이에 값을 입력할 때는 append가 유용하다.

벡터 연산

x<-c(1:5)
x+10    #배열 안에 있는 값에 +10해서 출력한다.(직접 적용은 안됨)
## [1] 11 12 13 14 15
x*10
## [1] 10 20 30 40 50

배열 비교

x<-c(1,2,3)
y<-c(1,2,3)
z<-c(1,2,4)

x==y        #벡터간 개별 값 비교
## [1] TRUE TRUE TRUE
x==z
## [1]  TRUE  TRUE FALSE
identical(x, y) #벡터간 전체 값 비교
## [1] TRUE
identical(x, z)
## [1] FALSE
w<-c(1:5)
x==w        #길이가 맞지 않아 뒤에 두 개는 false+warning
## Warning in x == w: 두 객체의 길이가 서로 배수관계에 있지 않습니다
## [1]  TRUE  TRUE  TRUE FALSE FALSE
identical(x,w)  #각 요소를 비교했을 때 일부 요소가 맞지 않으므로 false
## [1] FALSE
x<-c(1,2,3,4)
y<-c(1,2,3,4,4)
x==y
## Warning in x == y: 두 객체의 길이가 서로 배수관계에 있지 않습니다
## [1]  TRUE  TRUE  TRUE  TRUE FALSE
identical(x,y)
## [1] FALSE
setequal(x,y)   #두 벡터가 동일한 집합인지 판단. 즉, 동일한 값이 있으면 같은 집합으로 판단
## [1] TRUE
x<-c(1,2,5)
y<-c(3,4,5)
union(x,y)      #합집합 :중복제거
## [1] 1 2 5 3 4
intersect(x,y)  #교집합
## [1] 5
setdiff(x,y)    #차집합 :괄호 안에 먼저 쓰는 벡터 기준으로 값이 출력
## [1] 1 2
1%in%x      #x변수에 1이 있는지 찾는다. 있으면 ture, 없으면 false
## [1] TRUE
4%in%x
## [1] FALSE

벡터값 위치 찾기

x<-c('b','a','d','a',NA)
x
## [1] "b" "a" "d" "a" NA
'a'%in%x
## [1] TRUE
x=='a'
## [1] FALSE  TRUE FALSE  TRUE    NA
x[x=='a']       #벡터에 있는 'a'값 출력+NA
## [1] "a" "a" NA
which('a'==x)   #벡터값의 요소번호를 출력
## [1] 2 4
x[which('a'==x)]    #벡터에 있는 'a'값 출력
## [1] "a" "a"
is.na(x)
## [1] FALSE FALSE FALSE FALSE  TRUE
which(is.na(x)) #NA값의 위치 출력
## [1] 5
x[which('a'==x)]
## [1] "a" "a"
x[which('a'==x)]<-'aa'  #값 a를 aa로 변경
x
## [1] "b"  "aa" "d"  "aa" NA
x<-c(1:5)       #정수형
x       #실수형
## [1] 1 2 3 4 5
y<-c(1,2,3,4,5)
y
## [1] 1 2 3 4 5
setequal(x,y)
## [1] TRUE
identical(x,y)  #형태가 다르기 때문에 false
## [1] FALSE
#identical은 개별의 벡터값이 전부 동일해야하하고
  길이와 형태도 일치해야지만 TRUE.
str(y)
##  num [1:5] 1 2 3 4 5
str(y)
##  num [1:5] 1 2 3 4 5
as.integer(y)   #형변환 함수 :실수형>정수형
## [1] 1 2 3 4 5
identical(x,y)  #y를 직접 변경하지 않았기 때문에 false
## [1] FALSE
y<-as.integer(y)
identical(x,y)
## [1] TRUE

2. list(리스트)

-서로 다른 데이터 타입을 갖는 벡터들을 저장하거나
또다른 리스트가 저장 가능한 구조이다
-list(키=값, 키=값)

x<-list(name='김지은', addr='과천시', ph='01063546073')
x
## $name
## [1] "김지은"
## 
## $addr
## [1] "과천시"
## 
## $ph
## [1] "01063546073"
str(x)
## List of 3
##  $ name: chr "김지은"
##  $ addr: chr "과천시"
##  $ ph  : chr "01063546073"
class(x)
## [1] "list"
mode(x)
## [1] "list"
x$name      #리스트 x에 있는 특정 값만을 보고자 할 때
## [1] "김지은"
x[1]
## $name
## [1] "김지은"
x[[1]]
## [1] "김지은"
x[1:3]
## $name
## [1] "김지은"
## 
## $addr
## [1] "과천시"
## 
## $ph
## [1] "01063546073"

list 요소를 추가하는 방법

x$sal<-10000

list 요소를 제거하는 방법

x$sal<-NULL

list 요소를 수정하는 방법

x$ph<-'01063540000'

list 중첩

y<-list(a=list(val=c(1,2,3)), b=list(val=c(1,2,3,4)))
y$a; y$b
## $val
## [1] 1 2 3
## $val
## [1] 1 2 3 4