반응형

Atomic vectors


가장 기본적인 벡터 구조이다.


> x <- c(2.1, 4.2, 3.3, 5.4)

> x

[1] 2.1 4.2 3.3 5.4

vector에는 타입이 같은 다양한 값이 들어 갈 수 있다.


> x[c(3,1)]

[1] 3.3 2.1

x에 해당하는 인덱스의 값들을 찾아준다.


> order(x)

[1] 1 3 2 4

x를 오름차순으로 정렬 시, 인덱스의 순서를 알려준다.


> x[order(x)]

[1] 2.1 3.3 4.2 5.4

x를 오름차순으로 정렬 시, 인덱스의 순서대로 정렬을 해준다.


> x[c(1,1)]

[1] 2.1 2.1

같은 인덱스를 참고할 수 있다.


> x[c(2.1, 2.9)]

[1] 4.2 4.2

소수점 인덱스를 참고하면 내림을 하고 정수 인덱스의 값을 반환한다.


> x[-c(3,1)]

[1] 4.2 5.4

-c(3,1)은 c(-3,-1)과 같고 3번 인덱스 값, 1번 인덱스 값을 제외한 나머지 값을 나타낸다.


> x[c(-1,2)]

Error in x[c(-1, 2)] : only 0's may be mixed with negative subscripts

하나만 음수로는 나타낼 수 없다.(즉, 제외하고 나타내고는 불가능)


> x[c(T,T,F,F)]

[1] 2.1 4.2

논리연산으로 가능하다. 참인 것들만 나타내준다.


> x[x > 3]

[1] 4.2 3.3 5.4

x 벡터에서 3보다 큰 값들을 나타내준다. 


> x[c(T,F)]

[1] 2.1 3.3

x[c(T,F)]는 x[c(T,F,T,F)]와 같다. 즉, x벡터의 마지막까지 반복해준다.


> x[]

[1] 2.1 4.2 3.3 5.4

x 벡터를 나타내준다.


> x[0]

numeric(0)

x벡터의 0번째는 그냥 타입정도를 알려주고 값은 존재하지 않는다.


> y <- setNames(x, letters[1:4])

> y

  a   b   c   d 

2.1 4.2 3.3 5.4 

y에 x의 값을 순차적으로 대입해주는데 letters를 통해 name을 붙여 줄 수 있다.


> y[c("d","c","a")]

  d   c   a 

5.4 3.3 2.1 

y 벡터에 있는 d,c,a 네임에 해당하는 값을 가져온다.


> y[c("a","a","a")]

  a   a   a 

2.1 2.1 2.1 

같은 내용을 가져올 수 있다.


> z

abc def 

  1   2 

z 벡터는 현재 abc, def 네임을 가짐을 알 수 있다.


> z <- c(abc = 1, def = 2)

> z[c("a","d")]

<NA> <NA> 

  NA   NA 

인덱스에 존재하지 않는 값은 NA 로 출력된다.






Lists


list는 서로다른 Type인 Elements들이 들어갈 수 있다.

물론 list내에 list도 포함 가능하다.


> x <- list(1:3, "a", c(T,F,T), c(2.3, 5.9))

> str(x)

List of 4

 $ : int [1:3] 1 2 3

 $ : chr "a"

 $ : logi [1:3] TRUE FALSE TRUE

 $ : num [1:2] 2.3 5.9


> x

[[1]]

[1] 1 2 3


[[2]]

[1] "a"


[[3]]

[1]  TRUE FALSE  TRUE


[[4]]

[1] 2.3 5.9



이때 리스트 인덱싱 방법은 [[]]와 []가 있는데

[]는 리스트로 감싸진 결과를 알려주고

[[]]는 리스트를 뺀 벡터값을 돌려준다.


> x[1]

[[1]]

[1] 1 2 3


> x[[1]]

[1] 1 2 3


> x[[1]][2]

[1] 2




x에 리스트를 넣는데 리스트 내에 또 리스트를 감싸서 인덱싱을 해보자.


> x <- list(list(1,2), c(3,4))

> x[[1]]

[[1]]

[1] 1


[[2]]

[1] 2


> x[[1]][[1]]

[1] 1

> x[[1]][[2]]

[1] 2


> x[[2]][1]

[1] 3

> x[[2]][2]

[1] 4


x의 1번 인덱스에는 list(1,2)가 있으니 [[1]]을 해주면 list(1,2)가 나올 것이다.

이때 값 2를 추출하기 위해서는 x[[1]]의 [[2]]를 꺼내주면 된다.



Attribute



attribute는 메타데이터를 설정 할 수 있게 해준다.

이때 생성은 attr(변수명, 메타데이터명) <- "메타데이터 내용"

조회는 attribute(변수명)으로 한다.


> x <- 1:10

> attr(x, "attrname") <- "this is attr"

> x

 [1]  1  2  3  4  5  6  7  8  9 10

attr(,"attrname")

[1] "this is attr"


> attr(x, "attrname2") <- "this is attr2"

> attributes(x)

$attrname

[1] "this is attr"


$attrname2

[1] "this is attr2"






다음과 같은 코드도 한번 써보고 어떤 차이가 있는지 느껴보자.


> f <- factor(letters)

> levels(f) <- rev(levels(f))

> f

 [1] z y x w v u t s r q p o n m l k j i h g f e d c b a

Levels: z y x w v u t s r q p o n m l k j i h g f e d c b a


> f2 <- rev(factor(letters))

> f2

 [1] z y x w v u t s r q p o n m l k j i h g f e d c b a

Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z


> f3 <- factor(letters, levels = rev(letters))

> f3

 [1] a b c d e f g h i j k l m n o p q r s t u v w x y z

Levels: z y x w v u t s r q p o n m l k j i h g f e d c b a




이름을 지어주는 방법


첫번째로 아래와 같이 벡터 형성 시 이름을 지을 수 있거나

> x <- c(a = 1, b= 2, c= 3)

> x

a b c 

1 2 3 


두번째로 names를 통해 이름을 지을 수 있다.

> x <- 1:3

> names(x) <- c("a","b","c")

> x

a b c 

1 2 3 


세번째로 setNames를 통해 이름을 지을 수 있다.

> x <- setNames(1:3, c("a","b","c"))

> x

a b c 

1 2 3 


> unname(x)

[1] 1 2 3

> x <- setNames(1:3, c("a","b","c"))


> names(x) <- NULL

> x

[1] 1 2 3







반응형