벡터(vector) 와 첨자(subscript) , 벡터에서 위치(which) 및 연산 (max, min)

   벡터의 첨자 즉 괄호 계산은  처음 코딩 할때나 배울때,  어디에 쓰는지 알 수 없다.  하지만, 이것에 대한 기본을  알게 되면,  데이터 분석이나, 데이터를  정리 할때,  매우 유용하다.  R 프로그램 코딩 5년이 되어 가지만,  이것에 대한 사용을 알고 나서 앞으로 코딩 할때,  많은 도움이 되리라는 생각 이든다. 


3.7 벡터와 첨자

벡터는 1개 이상의 동일한 유형의 값을 갖는 변수 입니다. 예를 들어 6개의 콩깍지 안에 있는 완두콩의 숫자는 4, 7, 6, 5, 6, 7 입니다. 이 경우 완두콩(pass) 벡터의 길이가 6(length =6) 인 개체 입니다. 이 경우, 개체의 클래스 숫자(numberic)입니다. R에서 벡터를 생성하는 가장 쉬운 방법은 연결 함수 c를 사용해 생성 합니다.

pass <- c(4, 7, 6, 5, 6, 7)

벡터 pass 를 대상으로 모든 종류의 질문 명령을 실행 할 수 있습니다. 예를 들면, pass의 유형이 무엇인지 않기 위해 다음 코드를 사용합니다.

class(pass)
## [1] "numeric"


벡터의 크기를 알기 위해서는 다음 명령어를 사용합니다.

length(pass)
## [1] 6


벡터 기반 언어의 가장 큰 장점은 벡터의 모든 값을 대상으로 하는 질문 명령을 간단히 실행 수 있다는 점입니다. 대부분의 벡터 함수는 의미가 있는 이름을 가지고 있습니다.

mean(pass)
## [1] 5.833333
max(pass)
## [1] 7
min(pass)
## [1] 4

하지만, 다음과 같이 의미가 명확하지 않는 경우도 있습니다.

quantile(pass)
##   0%  25%  50%  75% 100% 
## 4.00 5.25 6.00 6.75 7.00


다른 방법으로 벡터를 생성하려면 scan 함수를 사용해 키보에서 데이터를 입력 합니다.

# pass <- scan()

숫자를 입력 하고 엔터를 치면 숫자가 입력 되고, 엔터 두번을 치면 입력 내용이 끝납니다. 잘 안쓰는 기능 입니다.



3.7.1 첨자를 사용해 벡터 요소 추출

때로는 벡터의 값 전체가 아닌 일부만을 사용해야 하는 경우가 있습니다. 이를 위해서 인덱스에 해당 하는 첨자의 사용 방법을 학습해야 합니다. R에서 첨자(subscript)는 대괄호[]와 함께 사용합니다. 다음 완두콩 (pass)벡터는 6개의 콩까지 안에 있는 완두콩의 개수를 보여 줍니다.

pass
## [1] 4 7 6 5 6 7

완두콩(pass)의 첫 번째 값은 4이고, 두 번째값은 7입니다. 요소 1에서 6까지, 첨자를 이용해 값을 간단히 참고 할 수 있습니다. 완두콩의 4번째 값을 다음과 같이 추출 할 수 있습니다.

여러값(2,3,6번째 값)을 추출 하려면 해당 위치를 설정하는 첨자 벡터를 사용하며 다음과 같은 두단계로 실행 한다.

pods <- c(2,3,6)
pass[pods]
## [1] 7 6 7

다음과 같이 한 단계로도 실행이 가능 합니다.

pass[c(2,3,6)]
## [1] 7 6 7

음수 첨자를 사용하면 해당 값을 벡터에서 삭제 할수 있습니다. 다음 코드는 완두콩(pass) 벡터에서 첫 번째 값을 제외한 모든 벡터값을 출력 하는 것입니다.

pass[-1]
## [1] 7 6 5 6 7

다음은 length 함수를 사용해 벡터의 길이를 계산한 후 마지막 값을 제외한 모든 벡터 값의 길이를 출력한 결과입니다.

pass[-length(pass)]
## [1] 4 7 6 5 6

벡터에서 값을 추출하는 숫자 수열을 사용할 수 있습니다. 완두콩(pass)의 처음 3개의 값은 다음과 같습니다.

pass[1:3]
## [1] 4 7 6


짝수값을 갖는 완두콩(pass)벡터 값은 아래와 같습니다.

pass[seq(2,length(pass),2)]
## [1] 7 5 7

다른 방법으로 짝수값을 갖는 완두콩 벡터를 계산 하면 다음과 같습니다.

# 몫이 0인 경우 짝수값으로 인식 함
pass[1:length(pass) %% 2 ==0]
## [1] 7 5 7


3.7.2 벡터 클래스

벡터 pass 숫자값으로 구성되어 있습니다. 전문 용어로 이러한 클래스를 numeic이하고 합니다. R은 6개 유형의 벡터가 있으며, 특정 벡터를 구성하는 모든 구성 요소가 동일한 클래스에 속해 있으면, 6개 유형 중 1개 유형에 해당하는 벡터가 구현 가능합니다. 6개 유형은 논리형, 정수형, 실수형, 복수소형, 문자열, 문자형, 원시형이 있습니다. 여러분은 항상 숫자, 논리, 문자형 벡터를 사용할 것입니다. 엔지니어와 수학자는 복잡한 숫자를 이용할 것입니다. 그러나 때로는 정수형이 원시형 데이터를 사용하지 않고 데이터를 분석 하는 것을 경험 할 수 있습니다.

3.7.3 벡터에서 요소 명명

어떤 경우에는 표시된 벡터를 갖고 분석하는 것이 유용합니다. 예를 들어 counts 벡터에서 0,1,2,.. 등의 발생 횟수라고 하고, 25개의 0, 12개의 1 이 있다고 한다면 관련 숫자 0~8과 같이 각 카운트에 대해 이름을 설정 하는 것이 좋습니다.

(counts <- c(25,12,7,4,6,2,1,0,2))
## [1] 25 12  7  4  6  2  1  0  2
names(counts)<-0:8

이제 counts 벡터를 검사할 때, 이름과 빈도 수를 볼 수 있습니다.

counts
##  0  1  2  3  4  5  6  7  8 
## 25 12  7  4  6  2  1  0  2

카운트의 횟수를 계산한 후 이름을 제거하려면 다음과 같이 as.vector 함수를 사용해야 합니다.

(st<-table(rpois(2000,2.3)))
## 
##   0   1   2   3   4   5   6   7   8   9 
## 190 445 560 393 233 115  39  19   4   2
as.vector(st)
##  [1] 190 445 560 393 233 115  39  19   4   2



3.7.4 논리 첨자로 분석

0에서 10까지 11개의 숫자를 갖는 벡터를 예로 들어 봅시다.

x<-0:10

두가지 다른 종류의 연산을 해 봅시다. 우선 해당 벡터의 모든 요소를 더한 값을 구해보면 다음과 같습니다.

sum(x)
## [1] 55

다음으로 몇 가지 논리적 조건을 통과한 데이터의 수를 계산 하면 다음과 같습니다. 얼마나 많은 값이 5이하인지 알고 싶다면 아래와 같이 하여야 합니다.

sum(x<5)
## [1] 5

두 가지 연산의 차이를 이해해 봅시다. 두 경우 모두 벡터 함수 sum을 사용하였지만 sum(x)는 x의 값을 합산한 것이고, sum(x<5)는 x는 5보다 작다라는 논리적 조건을 통과한 데이터의 개수를 계산한것입니다. 이러한 기능은 강제 형변환을 통해 했기 때문에 가능합니다. 논리적 TRUE는 숫자 1로 변환하고 FALSE는 숫자 0으로 강제 변환 하였기 때문입니다.

이 방법은 좋기는 하지만 x의 요소의 일부의 합을 계산 하는 것 같아 약간의 혼동이 존재 합니다. 만약에 이것에 대한 합을 구하려면, 아래와 같은 명령어를 실행 해야 합니다.

sum(x[x<5])
## [1] 10

이점에 대해 좀더 자세히 알아 봅시다. 논리 조건 x<5는 참(true) 또는 거짓(false) 입니다.

x<5
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

거짓은 0이 되고 참은 1이 된다는 것을 생각 할 수 있습니다. 첨자[x<5]의 벡터 값은 다음과 같이 5개의 1과 6개의 0으로 구성됩니다.

1*(x<5)
##  [1] 1 1 1 1 1 0 0 0 0 0 0

이제 논리 연산 결과와 x의 값을 곱해 봅시다.

x*(x<5)
##  [1] 0 1 2 3 4 0 0 0 0 0 0

곱연산 결과에 sum 함수를 적용하면 다음과 같이 0+1+2+3+4=10이 됩니다.

sum(x*(x<5))
## [1] 10

이 명령 또한 sum(x[x<5])과 동일한 결과를 생성하지만 결과가 간단치 않습니다. 벡터에서 가장 큰 3개 값의 합을 계산 한다고 가정 합니다. 이를 위해서는 2단계로 나누어서 실행 해야 합니다. 첫번째 벡터를 내림차순 으로 정렬(sort)하여야 하며, 두번째로는 역으로 정렬한 후 첫번째 3개 요소의 합을 구합니다. 이 작업은 작업을 단계별로 실행 하여 봅니다.

y<-c(8,3,5,7,6,6,8,9,2,3,9,4,10,4,11)

이제 sort 함수로 y값을 오름차순으로 정렬 합니다.

sort(y)
##  [1]  2  3  3  4  4  5  6  6  7  8  8  9  9 10 11

다음으로 rev함수를 사용해 역으로 정렬 합니다. 이를 위해 상향 방향키를 사용해 이전 명령을 불러온 다음 rev 함수를 실행 합니다.

rev(sort(y))
##  [1] 11 10  9  9  8  8  7  6  6  5  4  4  3  3  2

따라서 문제의 대한 답은 11+10+9=30이 되어야 합니다. 하지만 해답을 어떻게 계산 할 수 있는가? 일련의 첨자는 콜론 연산자를 사용해 생성할 수 있으며 1부터 3까지 첨자를 생성하려면 다음과 같이 합니다. 지금까지의 각 단계를 실행 하면 다음과 같습니다.

rev(sort(y))[1:3]
## [1] 11 10  9

따라서 연습문제에 대한 답은 다음과 같이 계산 할 수 있습니다.

sum(rev(sort(y))[1:3])
## [1] 30

벡터 y를 변경하지 않았으며, 공간을 소모하는 신규 벡터 또한 만들지 않고 계산 하였습니다. 분석을 하다 보면 벡터 내의 최대 또는 최소값의 첨자를 알아야 하는 경우가 있습니다. 다음 벡터 x 에서 최대값 6번째인 8이고 최소값 4번째인 1입니다.

x<-c(2,3,4,1,5,8,2,3,7,5,7)

최대와 최소값의 인덱스를 계산하기 위한 방법은 아래와 같습니다.

which(x == max(x))
## [1] 6
which(x == min(x))
## [1] 4

하지만, 다음과 같이 R의 내장 함수 which.max나 which.min을 사용하면 좀 더 빠르게 계산 할 수 있습니다.

which.max(x)
## [1] 6
which.min(x)
## [1] 4

댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...