안녕하세요. 언제나 휴일에 언휴예요.
이번 강의는 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