R01-벡터
R 은 하나의 데이터도 vector로 취급한다
- R에서 가장 큰 특징이다
- 숫자형 문자형 논리형 등의 데이터를 가지고 있는 1차원 집합이다
- 하나의 벡터는 하나의 데이터 타입을 가진다 => 이를 위반시 R 내부적으로 강제로 맞춘다
a <- 3
print(a[1]) # 하나의 값을 넣어도 인덱싱이 가능하다는것이 a가 벡터라는것을 보여준다
print(is.vector(a))
[1] 3
[1] TRUE
벡터를 생성하는 방법
- c()
- :
- seq()
- rep()
1. c => 벡터를 생성하는 가장 기본적인 방법이다
a<-c(1,2,3,4)
print(mode(a))
print(typeof(a))
b<-c(1,3,4,"a")
c<-c(T,F,T)
print(c(c(1,2,3),4))
[1] "numeric"
[1] "double"
[1] 1 2 3 4
2. : => 연속적인 수치형 데이터를 생성할때 주로 사용한다 (1씩 증가 또는 감소하는 벡터만을 생성할 수 있다)
# : 연속적인 수치형 데이터를 생성할때 주로 사용한다
# :는 1씩 증가 또는 감소하는 벡터만 가능
a<-1:20
print(a)
b<-2:21
print(b)
# 역순으로도 가능하다
c<-1:-10
d<-0:-5
print(c)
print(d)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
[1] 1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
[1] 0 -1 -2 -3 -4 -5
3. seq => seq(from,to,by)의 형태를 가지고 by를 통해 증가하는 크기를 설정할수 있게 해준다
- length.out 옵션을 통해 간격을 자동으로 조절할 수도 있다
print(seq(1,5))
print(seq(1,10,2)) # 홀수
print(seq(1,10,length.out=4))
[1] 1 2 3 4 5
[1] 1 3 5 7 9
[1] 1 4 7 10
4. rep => 주어진 값을 반복하여 벡터를 생성한다
#각 parameter에 따른 결과값들을 비교해보자
print(rep(1,times=3))
print(rep(c(1,2,3),times=3))
print(rep(c(1,2,3),each=3))
print(rep(1:3,length.out=10))
[1] 1 1 1
[1] 1 2 3 1 2 3 1 2 3
[1] 1 1 1 2 2 2 3 3 3
[1] 1 2 3 1 2 3 1 2 3 1
벡터의 길이를 확인하는 방법
- length()
- NROW() => 대문자임을 명심해야 한다
a <- c(1,2,3,4)
print(length(a))
b<-1:1002
print(length(b))
print(NROW(b))
[1] 4
[1] 1002
[1] 1002
벡터의 각 셀에 이름을 부여할 수 있다
- names(x)
- names (x) <- c()
a<-c(1,2,3,4)
print(names(a)) # null 이다
names(a) <- c("a","b","c","d")
print(names(a))
NULL
[1] "a" "b" "c" "d"
벡터의 연산은 원소 대 원소 단위로 연산을 수행
1.기본적인 사칙 연산 수행 가능
a<-c(1,2,3,4)
b<-c(1,1,1,3)
print(a+1) # scalar sum
print(a+b) # vector + vector
print(a-b)
print(a*b)
print(a/b)
[1] 2 3 4 5
[1] 2 3 4 7
[1] 0 1 2 1
[1] 1 2 3 12
[1] 1.000000 2.000000 3.000000 1.333333
2.벡터의 길이가 다를때의 연산
a<-c(1,2,3,4)
print(a+1) # 원소가 한개인 벡터 일때는 무조건 긴 벡터의 배수이다
b<-c(10,100)
print(a+b) # 차례대로 1+10 2+100 3+10 4+100 이 되었다
c<-c(10,100,1000)
print(a+c) # warning message : longer object is not multiple of shorter object lenth
# 그렇다고 수행이 안되는건 아니고 차례대로 재사용하여 실행된다 10+1 100+2 1000+3 10+4
[1] 2 3 4 5
[1] 11 102 13 104
Warning message in a + c:
“두 객체의 길이가 서로 배수관계에 있지 않습니다”
[1] 11 102 1003 14
3.벡터끼리 논리 연산도 가능하다 => 원소 대 원소의 연산임을 꼭 기억
a <- c(1,2,3,4)
print(a<3)
b<-c(1,3,2,1) # 원소 대 원소
print(a<b)
print(a==b)
c<-c(1,2,3,4)
print(identical(a,c)) # 객체가 동일한지 비교할때는 identical 을 이용하자
print(1 %in% a) # 어떤값이 벡터에 포함되어있는지 알려주는 연산자다
[1] TRUE TRUE FALSE FALSE
[1] FALSE TRUE FALSE FALSE
[1] TRUE FALSE FALSE FALSE
[1] TRUE
[1] TRUE
# &, |, !(not), xor
# 특별히 xor은 두 논리값이 같으면 TRUE 다르면 FALSE를 준다
print(c(T,F,T) & c(TRUE,TRUE,TRUE))
print(c(T,F,T) | c(TRUE,TRUE,TRUE))
print(xor(c(T,F,T),c(T,T,F)))
[1] TRUE FALSE TRUE
[1] TRUE TRUE TRUE
[1] FALSE TRUE TRUE
# any or
a <- c(1,2,3,4)
print(any(a>3)) # 하나라도 3보다 크면 True
print(all(a>3)) # 벡터내의 모든 논리값이 True 일때만 True를 돌려준다
[1] TRUE
[1] FALSE
4.set operator 도 가능하다 => set은 중복 허용하지 않는다
print(setdiff(c("a","b","c"),c("b","c","d")))
print(union(c("a","b","c"),c("b","c","d")))
print(union(c("a","a","a"),c("b","b","b")))
print(intersect(c("a","b","c"),c("b","c","d")))
print(setequal(c("a","b","c"),c("b","c","d")))
[1] "a"
[1] "a" "b" "c" "d"
[1] "a" "b"
[1] "b" "c"
[1] FALSE
벡터 indexing , slicing
1. 기본적인 indexing ,slicing
- 1부터 시작
- 인덱싱 [ ] 안에 벡터 형태가 들어갈 수 있다 {c, :, rep, seq} 다 가능하다
- 인덱싱을 통해 값에 접근 또는 업데이트 할 수 있다
- 각 셀의 name도 index로 사용할 수 있다 이때 slicing은 사용불가하다
- 음수 인덱싱은 해당 값을 제외한다
a<-c(1,2,3)
print(a[1])
print(a[c(1,2)])
print(a[c(1,3)])
print(a[1:3])
b<-seq(1,50)
print(b[seq(1,50,2)]) # 홀수만 출력
names(a) <-c("a","b","c")
print(a[c("a")])
print(a[c("a","c")])
[1] 1
[1] 1 2
[1] 1 3
[1] 1 2 3
[1] 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49
a
1
a c
1 3
#음수 인덱싱은 해당 값을 제외한다
c <- 1:10
print(c[-3:-1])
print(c[-1:-3])
print(c[-(1:3)])
print(c[-c(1,10)])
print(c[-length(c)])
print(c[1:length(c)-1])
[1] 4 5 6 7 8 9 10
[1] 4 5 6 7 8 9 10
[1] 4 5 6 7 8 9 10
[1] 2 3 4 5 6 7 8 9
[1] 1 2 3 4 5 6 7 8 9
[1] 1 2 3 4 5 6 7 8 9
2.벡터 값 업데이트 또는 벡터의 확장
a <- 1:10
a[c(1,3)]<-c(10,30)
print(a)
a[15] <- 15 # 값이 지정이 안된 위치에는 NA값이 채워진다
print(a)
[1] 10 2 30 4 5 6 7 8 9 10
[1] 10 2 30 4 5 6 7 8 9 10 NA NA NA NA 15
3.logial indexing
- True 값인 index만 return한다
- 인덱스 [ ] logical operator을 활용하여 원하는 값만 출력할 수 있다 ex)3의배수만 출력
a<-c(1,2,3)
print(a[c(T,T,T)])
print(a[c(T,F,T)])
print(a[a>1]) # a가 1보다 큰 값만 반환
sample_vec = 100:200
print(sample_vec[sample_vec%%2==1]) # 홀수
print(sample_vec[sample_vec%%3==0]) # 3의 배수
[1] 1 2 3
[1] 1 3
[1] 2 3
[1] 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137
[20] 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175
[39] 177 179 181 183 185 187 189 191 193 195 197 199
[1] 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156
[20] 159 162 165 168 171 174 177 180 183 186 189 192 195 198
4. 인덱싱 할때 유용한 함수들
- which() 논리값(벡터)을 인수로 받아서 TRUE의 위치를 반환
- which.max() 최댓값의 위치를 반환
- which.min() 최솟값의 위치를 반환
rainfall <- c(21.6,22.6,45,102, 53,242,21,21)
print(which(rainfall>100))
print(which.max(rainfall))
print(which.min(rainfall)) # 최솟값 두개 존재 => 첫번째꺼 인덱스를 가져온다
[1] 4 6
[1] 6
[1] 7
rainfall <- c(21.6,22.6,45,102, 53,242,21,21)
print(rainfall[which(rainfall>100)] )
[1] 102 242