본문 바로가기
R

5. R 연산 연습

by #Glacier 2018. 11. 20.
반응형

안녕하세요~ 이번엔 R에서의 연산연습을 해보려고 합니다. 거두절미하고 바로 들어갈께요~



자, 위의 그림처럼 일단 4가지를 해볼께요.


  # 함수내에서 연산

함수 내에서의 연산인데요, a라는 임의의 변수에 콤바인 함수를 써서 10에 사칙연산을 적용해 보았습니다.

(a<-c(10+4, 10-4, 10*4, 10/4))

[1] 14.0  6.0 40.0  2.5

이렇게 한 결과, ()처리를 했기 때문에 바로 결과가 출력됩니다. 보시다시피, 14, 6, 40, 2.5로 잘 계산이 되었죠?

이건 기초일 뿐, R은 계산기가 아닙니다................(Windows에 내장되어있는 계산기 프로그램보단 치기 편하죠..?) 

다음은,


  # 변수의 결합
a1<-c(10, 20, 30)
a2<-c(40, 50, 60)
(a3<-c(a1, a2))
[1] 10 20 30 40 50 60


a1이라는 변수에 10,20,30을 넣고, a2라는 변수에 40, 50, 60을 넣은 후, 

a3이라는 변수에 a1과 a2를 합치면 어떻게 될까요?


그럼 10, 20, 30, 40, 50, 60 모두 들어간 a3이라는 변수가 탄생하게 됩니다!

  # 수열
a4<-1:10
a5<-10:1
a4
 [1]  1  2  3  4  5  6  7  8  9 10
print(a5)
 [1] 10  9  8  7  6  5  4  3  2  1


R에서 :표시는 수열을 만들 때 사용되는데요, a4라는 변수에 1부터 10까지 수열을 만들어 봤습니다.

그렇게 a4변수를 출력하면 1부터 10까지 다 들어가있는 것을 확인할 수 있습니다.

a5변수처럼 10에서 1까지의 역으로 진행되는 수열도 만들 수 있습니다. 요번에는 print() 함수를 써봤네요.

  # seq함수
(a6<-seq(from=14, to=34, by=2.5))
[1] 14.0 16.5 19.0 21.5 24.0 26.5 29.0 31.5 34.0
(a6<-seq(14, 34, 2.5))
[1] 14.0 16.5 19.0 21.5 24.0 26.5 29.0 31.5 34.0


이번엔 seq함수인데요, seq는 sequence(시퀀스)를 나타냅니다.

a6이라는 변수에 14부터 34까지 by는 간격을 의미합니다. 2.5씩 커지는 거죠!

그러면 정확히 14부터 34까지 2.5씩 증가하는 수열을 만들어 줍니다.

그런데 제가 from, to와 by라는 명령어를 집어넣지 않고도 14, 34, 2.5만 썼는데 똑같은 값이 출력된 것을 보실 수 있습니다.

이는 seq함수의 default값이 뭔지 알 수 있게 해줍니다. 즉 seq함수의 default값은 from, to, by라는 것을 알 수 있습니다.

앞으로도 진행될 내용이지만 각 패키지 안의 함수들과 기본 함수들은 default값들이 있다는 점을 생각해두세요.


(a6<-seq(from=34, to=14, by=-4))
[1] 34 30 26 22 18 14


이렇게 -4씩 감소하는 수열을 만들어 응용해볼 수도 있구요,

(a6=seq(from=14, to=34, length.out=4))
[1] 14.00000 20.66667 27.33333 34.00000


이번에는 length.out이라는 명령어를 처음 보셨을 텐데요, length.out은 4개로 쪼개는 것을 의미합니다.

14와 34까지 4등분 해달라. 이렇게 명령하는걸로 이해하시면 됩니다. 그러면 R이 계산해서 a6함수에 14부터 34까지

4등분으로 증가하는 수열을 보여줍니다.


그럼 다음으로 넘어가볼까요~




이번엔 rep함수인데요, 감이 이제 슬슬 오실 것이라 생각됩니다. rep은 repeat이겠죠~?... 즉 반복함수입니다.


  # rep함수
(a<-rep(1, times=3))
[1] 1 1 1


rep(반복할 숫자, 횟수)로 표현이 됩니다. 1을 3번 반복하라고 해봤습니다.

(a<-rep(1, 3))
[1] 1 1 1


위에서 봤듯이, 이것은 rep함수의 default 값을 알게 해줍니다. times를 안 써줘도,

default가 반복횟수이기 때문에 반복횟수를 사용하고자 하면 구지 times를 안써줘도 됩니다!

(a<-rep(1:5, 3))
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
(a<-rep(1:5, each=3))
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5


앞서서 수열을 만들었듯이 수열을 3번 반복할 수도 있습니다.

그리고 each함수를 볼 수 있는데요, 결과값을 보시면 이해가 되실거라 믿습니다.

1부터 5까지 수열을 만들었는데 12345 12345 12345가 아니라, each, 각각 3회 반복해라라는 뜻입니다.

즉, 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 가 되는 것입니다. 이러한 사소한 것까지 되니까 신기하죠~....?

a<-c(1,2,3)
(a1<-rep(a, 3))
[1] 1 2 3 1 2 3 1 2 3
(a1<-rep(a, each=3))
[1] 1 1 1 2 2 2 3 3 3


앞 선 것들의 응용입니다. a함수에 1,2,3을 넣고, a를 3번반복해도 똑같이 1,2,3,1,2,3,1,2,3이 됩니다.

또 each를 사용하면 1,1,1,2,2,2,3,3,3 이 되죠.

(a2<-c(rep(a1, 3), rep(a1, each=3)))
 [1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 2 2
[39] 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3


요번엔 조금 복잡해보일지도 모르겠습니다만, 조금 더 응용한 것입니다.

a2라는 변수에 콤바인함수를 써서 a1을 3번 반복한 것과, a1을 각각3회 반복 한 것을 합친 값을 집어넣어 주었습니다.

그러면 자연스럽게 a1이 앞서서 1 1 1 2 2 2 3 3 3 이었으니까, 이게 3회 반복 되고, 더해서

1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 이 됩니다.


이번엔 변수의 선택에 대해서 알아보겠습니다. 앞서 a2 변수를 가지고 제가 원하는 변수만 출력해볼까요?



a2

 [1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 2 2
[39] 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3


a2[숫자]를 넣게되면 a2는 Matrix(행렬)가 아니기 때문에 변수 순서가 됩니다.


a2[1]
[1] 1
a2[39]
[1] 2
a2[1:3]
[1] 1 1 1
a2[c(1,4,7)]
[1] 1 2 3


a2의 첫번째 값을 출력하면 보시다시피, 1이 출력됩니다. 그럼 저 위에서 볼 수 있듯이, 

[39]번째 값을 출력하면 당연히 2가 나오겠죠?

a2[1:3]은 처음 값부터 세 번째 값을 출력해보라는 명령입니다. 당연히 1 1 1 이 나오지요!

a2[c(1,4,7]은 첫 번째, 네 번째, 일곱 번째 값을 출력해보라는 겁니다. 그러면 1 2 3이 나오겠죠~


a2[-c(1,2,3)]
 [1] 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2
[39] 2 2 2 2 3 3 3 3 3 3 3 3 3


# 여기서 -를 잘 보셔야 합니다. r에서의 -는 빼기라는 연산이 될 수도 있지만 "~을 제외하라"라는 명령도 됩니다.

그러면 저 명령어의 의미는 무엇일까요? 당연히 1,2,3번 벡터의 값을 제외하고 보여줘라 라는 의미가 됩니다.

그러면 결과도 보시다시피 1:3번째 값인 1 1 1 이 제외되고 보여집니다!



여기까지 되게 쓴 내용은 많은 것 같은데, 내용은 그렇게 많지 않네요!! 앞으로 할 일이 태산인데;;.. 헉헉

그럼 바로 이어서 가보겠습니다.


이렇게 이제 변수 선택을 해봤는데요~ 조건을 주어서 선택해보는 건 어떨까요? 

이번엔 조건문을 이용해서 원소 선택을 해보겠습니다.




 a<-c(1:30)
a>15
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[25]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE


a라는 변수에 1부터 30까지 수열을 만들어 주고, (당연히 벡터의 수는 30개겠죠?) a가 15보다 큰가? 라고 명령하면

아뇨아뇨아뇨아뇨~ 네네네네~ (FALSE와 TRUE) 참과 거짓으로 표현해줍니다. 당연히 16부터 TRUE가 나오게 됩니다.

이번엔 어렸을 때 들어보신 몫과 나머지에 관계입니다.


a%%2==0
 [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[13] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE
[25] FALSE  TRUE FALSE  TRUE FALSE  TRUE


a[a%%2==0]
 [1]  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30


a가 1부터 30인데 %%는 뒤의 숫자로 나누고 난 나머지를 뜻합니다. R에서는 같다가 =이 아니라 ==입니다. 

==가 equal의 뜻입니다!

즉 a를 다 2로 나누고 난 나머지가 0이야? 라고 명령하는 것입니다. 그러면 당연히 2의 배수만 TRUE가 뜨게 되겠죠.

그러면 그 TRUE뜬 값을 직접 보고 싶으면 위에 해봤듯이 []를 사용해서 a[연산된 값]을 보여줘 라고 쓰면,

숫자로 보여지게됩니다.


이번엔 &과 | 표시를 알아보겠습니다. &은 and의 역할을, |은 or의 역할을 합니다.


(그림에서 제가 &&를 친것은 제외하겠습니다..잘 못친거라..)

a[a>=16 & a%%2==0]
[1] 16 18 20 22 24 26 28 30
a[a>=16 | a<=3]
 [1]  1  2  3 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


이처럼 a가 16보다 크거나 같고(>=), 2로 나누었을 때의 나머지가 0인 것을 보여달라는 명령을 하면, 

16보다 크거나 같으면서 짝수인 것을 출력하게 됩니다. 즉 두 조건을 모두만족하는 것을 보여주게 됩니다.


다음은, 16보다 크거나 같거나, 3보다 작거나 같은 걸 출력해달라는 명령어를 치면, 

두 조건 각각 만족하는 원소를 출력합니다. 즉 16~30까지와 1~3까지 출력되겠죠.


다음은 index를 부여해보겠습니다.

(z<-letters[1:5])
[1] "a" "b" "c" "d" "e"
names(z)<-c("에이","비","씨","디","이")
z
에이   비   씨   디   이 
 "a"  "b"  "c"  "d"  "e"


letters를 쓰면 자동적으로 알파벳 순서대로 지정되는데요, 즉 알파벳 순서대로 a,b,c,d,e가 지정됩니다.

z에는 a,b,c,d,e,가 들어가있는데, names()함수를 쓰면, names(z), z라는 변수에 이름을 명명한다는 의미입니다.

그럼 z는 벡터가 5개 있으니까 이름은 5개면 되겠죠? 그래서 저는 "에이", "비","씨,"디","이" 라고 명명했습니다.

캐릭터(글자)니까 따옴표 처리 해주시면 됩니다! 그렇게 z를 출력해보면

a b c d e 위에 이름이 명명된것을 볼 수 있습니다!


이제 어느정도 감이 오시나요?

이번엔 제가 가끔씩 말했던 numeric, character같은 데이터 타입에 대해 간단히 알아보겠습니다.


Data Type을 알아보는 함수는 mode()함수를 이용하는데요, 앞선 z에 대해서 mode(z)를 쓰면 뭐가 나올까요?

당연히 글자로되있으니 Character라고 출력됩니다.


데이터 타입은 총 3가지로 구분되는데요,

1) Numeric : 숫자이며 integer(정수), double(소수점이 있는 숫자형)

2) Logical : 논리연산자로서 T,F(TRUE, FALSE)

3) Character : 글자


이렇게 3가지가 됩니다.


이번엔 Character함수를 가지고 여러가지를 해보겠습니다.




 # Character를 이용한 구분자변환

paste()함수는 이어주는 역할을 합니다. paste("붙일 내용","붙일 내용", sep="")이렇게 정의할 수 있습니다.


paste("2016", "07", "15")
[1] "2016 07 15"

paste("2016", "07", "15", sep="-")
[1] "2016-07-15"


오늘 날짜로 해봤는데요, 2016, 07, 15를 이어봤습니다.

그러면 벡터 1개로 이어진것을 볼 수 있죠? 3개를 더해서 1개로 이었습니다.

거기다 sep="-"를 써서 "-"로 구분해봅니다. seperate가 되겠죠? 그러면 2016-07-15로 하나로 구분하여 합쳐줍니다.

a<-c("2016", "07", "15")
b<-c("년","월","일")
paste(a,b)
[1] "2016 년" "07 월"   "15 일" 


이렇게 붙여볼수도 있구요~


a<-"가나다라마바사"
substr(a,1,3)
[1] "가나다"


이번엔 substr()함수를 썼는데, substr(변수, 시작, 끝)으로 정의할 수 있습니다 sub가 ~부분 의 뜻을 가지고, str가 구조를 뜻하므로

전체에서부분만 따오는 걸로 이해할 수 있겠죠?

a가 "가나다라마바사"라고 되있으니 a를 1~3번째 글자만 가져온 명령어를 실행한 것입니다.


오늘은 저번에 이어서 연산을 더 해보고, 데이터 구조를 간단히 알아봤는데요! 

다음에는 행렬(차원을 가진 벡터)에 대해서 알아보겠습니다.

그럼 5. R 연산연습은 여기서 마치겠습니다.


+ p.s 제가 언급하지 않은 부분이 있는데 그건 ?함수입니다.

실행창에서 어떤 함수에 대해서 더 알고싶다, 혹은 모르겠다 하실때, 예를들면 rep함수에 대해 알고싶다. 할 때는


실행창에 ?rep 을 치고 실행시켜주시면 됩니다.




그러면 이렇게 설명이 저절로 인터넷 창으로 뜨고,  더해서 심화된 이해를 할 수 있습니다.

반응형

'R' 카테고리의 다른 글

7. airquality 데이터를 이용한 데이터변환  (0) 2018.11.20
6. R 행렬구조  (0) 2018.11.20
4. R Programming 기초  (0) 2018.11.20
3. 분석 마스터 플랜  (0) 2018.11.20
2. 분석 수행 전 단계  (0) 2018.11.20