뉴질랜드 aukland 대학의 ross lhaka, robert clifford gentleman이 1995년에 개발한 소프트웨어이고 데이터 분석을 위한 통계 및 그래픽스를 지원하는 무료 소프트웨어이다.
- R은 무료 소프트웨어
- 데이터 분석을 위해 가장 많이 사용되는 통계 플랫폼
- 복잡한 데이터를 다양한 그래프로 표현할 수 있다.
- 분석을 위한 데이터를 쉽게 저장하고 조작할 수 있다.
- 누구든지 유용한 패키지를 생성해서 공유 할 수 있고,
새로운 기능에 대한 전달이 빠르다.
- OS에 제한을 받지 않는다=어떤 OS에서도 설치할 수 있다.
- 변수 이름은 알파벳, 숫자, _, .(마침표)를 사용한다.
- 변수 이름의 첫 글자는 알파벳, 마침표로 시작할 수 있다.
- 마침표로 시작하는 경우에는 바로 뒤에 숫자를 입력할 수 없다. 예)변수명으로 가능 :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
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
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
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차원 배열구조(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
-서로 다른 데이터 타입을 갖는 벡터들을 저장하거나
또다른 리스트가 저장 가능한 구조이다
-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"
x$sal<-10000
x$sal<-NULL
x$ph<-'01063540000'
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