[태그:] <span>end</span>

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 scalar와 vector에 관한 내용으로 R언어의 가장 기초적인 자료 구조입니다.

본문에서는 동영상 강의에서 다루지 못한 내용을 일부 포함하고 있습니다.

#다루는 내용
scalar 개념
vector 개념 및 생성1 c()
vector 생성2 start:end
vector 생성3 seq(from,to,by)
vector 생성4 sequence()
vector 생성5 rep()
길이 length()
원소에 접근 v[n]
이름 부여 names(v)

scalar 개념

scalar는 하나의 값으로 이루어진 자료입니다.

R언어에 scalar 자료 구조를 제공하는 것이 있는 것이 아니예요.

결국 vector와 비교하기 위해 나온 개념일 뿐입니다.

> #scalar
> s1 = 2
> s2 = 'a'
> s3 = c('Hello')
> s1
[1] 2
> s2
[1] "a"
> s3
[1] "Hello"

vector 개념 및 생성1 c()

vector는 같은 종류에 자료 여러 개를 일차원으로 구성한 자료 구조입니다.

vector를 생성하는 방법은 여러 가지가 있는데 가장 많이 사용하는 방법 중 하나가 c()함수를 이용하는 것입니다.

c(…) – This is a generic function which combines its arguments.

* help(c) 인용

입력 인자로 전달한 것을 하나로 묶어 줍니다.

다음은 numeric 를 인자로 전달하여 vector를 만드는 것과 charater를 인자로 전달하여 vector를 만드는 예입니다.

> v1 = c(1,2,3)
> v1
[1] 1 2 3
> v2 = c('a','b','c')
> v2
[1] "a" "b" "c"
> class(v1)
[1] "numeric"
> class(v2)
[1] "character"

만약 numeric 인자와 character 인자가 섞이면 모든 자료를 character로 변환하여 vector를 만듭니다.

numeric 인자와 logical 인자가 섞이면 모든 자료를 numeric으로 변환하여 vector를 만듭니다.

> v3 = c(1,2,'a')
> v3
[1] "1" "2" "a"
> v4 = c(1,2,TRUE)
> v4
[1] 1 2 1

c() 함수에서 변환 순서

NULL < raw < logical < integer < double < complex < character < list < expression

vector 생성2 start:end

strat:end 표현은 start~end 구간에 1씩 증가하는 vector를 만들어 줍니다.

> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10
> 2:8
[1] 2 3 4 5 6 7 8
> 3.5:8.6
[1] 3.5 4.5 5.5 6.5 7.5 8.5
> 3.5:8
[1] 3.5 4.5 5.5 6.5 7.5

vector 생성3 seq(from,to,by)

seq(…) : sequence generation

seq()함수를 이용하면 순차적인 값으로 vector를 만들 때 증가하는 폭을 결정할 수 있습니다.

이 때 증가하는 폭을 양수가 아닌 음수도 가능합니다.

만약 seq() 함수 결과가 0개 원소라면 Error입니다.

Error 메시지로 “‘by’ 인자내에 잘못된 부호가 있습니다.”라고 나옵니다.

예를 들어 seq(from=100, to=1, by=3)을 호출하면 Error입니다.

> seq(from=1, to=100, by=3)
 [1]   1   4   7  10  13  16  19  22  25
[10]  28  31  34  37  40  43  46  49  52
[19]  55  58  61  64  67  70  73  76  79
[28]  82  85  88  91  94  97 100
> seq(from=100, to=1, by=-3)
 [1] 100  97  94  91  88  85  82  79  76
[10]  73  70  67  64  61  58  55  52  49
[19]  46  43  40  37  34  31  28  25  22
[28]  19  16  13  10   7   4   1
> seq(from=100, to=1, by=3)
Error in seq.default(from = 100, to = 1, by = 3) : 
  'by'인자내에 잘못된 부호가 있습니다

vector 생성4 sequence()

sequence(nvec, …) : create a vector of sequences

첫 번째 인자로 전달한 수만큼의 순차적인 원소로 구성하는 벡터를 만들어 준다는 개념입니다.

sequence(5) 라고 표시하면 1부터 1씩 증가하는 5개의 원소로 구성하는 벡터를 만들어 줍니다.

> sequence(5)
[1] 1 2 3 4 5

sequence(1:3)라고 표시하면 1부터 1씩 증가하는 1개의 원소, 1부터 1씩 증가하는 2개의 원소, 1부터 1씩 증가하는 3개의 원소로 구성하는 벡터를 만들어 줍니다.

> sequence(1:3)
[1] 1 1 2 1 2 3

만약 출발점과 증가하는 값을 다르게 하려면 from과 by를 이용합니다.

예를 들어, sequence(5,from=3, by=2)라고 하면 3부터 2씩 증가하는 5개의 원소로 벡터를 만들어 줍니다.

> sequence(5,from=3,by=2)
[1]  3  5  7  9 11

sequence 함수에 첫 번째 인자는 음수가 올 수 없지만 from과 by는 음수가 올 수 있습니다.

(* 첫 번째 인자는 vector를 구성할 것이 몇 개인지 결정하는 것이므로 음수가 올 수 없어요.*)

sequence(3, from=-5)라고 하면 -5부터 1씩 증가하는 3개의 원소로 vector를 만듭니다.

> sequence(3,from=-5)
[1] -5 -4 -3

sequence(3,from=3,by=-5)는 3부터 5씩 감소하는 3개의 원소로 vector를 만듭니다.

> sequence(3,from=3,by=-5)
[1]  3 -2 -7

vector 생성5 rep()

rep(…) :replicate elements of vectors and lists

원소를 중복해서 벡터를 만들 때 rep를 사용합니다.

첫 번째 전달한 인자를 두 번째 인자만큼 반복합니다.

rep(3,4) 는 3을 4번 반복하여 vector를 만듭니다.

> rep(3,4)
[1] 3 3 3 3

rep(c(1,2,3),4) 는 c(1,2,3)한 결과 1 2 3을 4번 반복하여 vector를 만듭니다.

> rep(c(1,2,3),4)
 [1] 1 2 3 1 2 3 1 2 3 1 2 3

each 표현에 값을 전달하면 각 원소를 반복하여 vector를 만듭니다.

rep(c(1,2,3),each=4)는 c(1,2,3)의 각 원소를 4번씩 반복하여 vector를 만듭니다.

> rep(c(1,2,3),each=4)
 [1] 1 1 1 1 2 2 2 2 3 3 3 3

길이 length()

length(x) : length of an object


length() 함수는 길이를 구할 때 사용합니다.

입력 인자로 vector를 전달하면 vector의 원소 개수를 반환합니다.

length(c(1,2,3))의 결과는 c(1,2,3)으로 만들어진 vector의 원소 개수 3입니다.

length(c(“홍길동”,”강감찬”,”김구”))의 결과도 c(“홍길동”,”강감찬”,”김구”)로 만들어진 vector의 원소 개수 3입니다.

> length(c(1,2,3))
[1] 3
> length(c("홍길동","강감찬","김구"))
[1] 3

원소에 접근 v[n]

원소에 접근할 때 대괄호를 사용합니다.

대괄호에 인덱스는 1부터 시작하며 0은 원소 형식을 반환합니다.

c(“홍길동”,”강감찬”,”김구”)[1]의 결과는 첫 번째 원소인 “홍길동”입니다.

c(“홍길동”,”강감찬”,”김구”)[0]은 원소 형식인 character입니다. 이 때 character(0)을 반환합니다.

다음의 예제 코드를 통해 이해해 보세요.

> c("홍길동","강감찬","김구")[1]
[1] "홍길동"
> c("홍길동","강감찬","김구")[2]
[1] "강감찬"
> c("홍길동","강감찬","김구")[3]
[1] "김구"
> c("홍길동","강감찬","김구")[0]
character(0)
> v1=c("홍길동","강감찬","김구")
> v1[1]
[1] "홍길동"
> v1[0]
character(0)
> c(1,2,3)[0]
numeric(0)


이름 부여 names(v)

이름을 확인하거나 설정할 때 names() 함수를 사용합니다.

다음 예제로 Look & Feel ~

> v1 = c(90,88,77)
> names(v1)=c("홍길동","강감찬","고수길")
> v1
홍길동 강감찬 고수길 
    90     88     77 
> names(v1[1])
[1] "홍길동"
> v1[1]
홍길동 
    90 

R 입문