R-01; vector

tommylee·2021년 7월 14일
0

R

목록 보기
1/1

R01-벡터

R 은 하나의 데이터도 vector로 취급한다

  • R에서 가장 큰 특징이다
  • 숫자형 문자형 논리형 등의 데이터를 가지고 있는 1차원 집합이다
  • 하나의 벡터는 하나의 데이터 타입을 가진다 => 이를 위반시 R 내부적으로 강제로 맞춘다
a <- 3
print(a[1]) # 하나의 값을 넣어도 인덱싱이 가능하다는것이 a가 벡터라는것을 보여준다
print(is.vector(a))
[1] 3
[1] TRUE

벡터를 생성하는 방법

  1. c()
  2. :
  3. seq()
  4. 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
profile
capture the moment when I learn

0개의 댓글