R벡터는 아토믹 베터와 리스트(list)로 구분할 수 있다. 리스트는 제네릭 벡터라 불리기도 한다.
이런 리스트가 제네릭(generic)인 이유는 그 안에 다른 데이터 타입을 가진 벡터들을 하나로 묶을 수 있기 때문이다.
리스트는 기본적으로 list() 함수로 만든다.
> x <- 1:10
> y <- LETTERS[1:10]
> z <- list(x,y)
> z
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
숫자형 벡터 x와 문자형 벡터 y를 list() 함수에 넣어 리스트 z를 만들었다.
객체 z는 이제 서로 다른 타입의 데이터를 가지고 있으므로 아토믹(atomic) 성질을 잃었다. 그렇지만 아직도 벡터이다.
> is.atomic(z)
[1] FALSE
> is.vector(z)
[1] TRUE
R리스트는 서로 다른 타입의 데이터를 가질 수 있다는 점이 아토믹 벡터와 다른점이다.
아토믹 벡터에 names()함수를 사용하여 이름을 부여했던 것처럼 리스트에도 이를 적용 할 수 있다.
리스트에서 이름 없이 사용하는 경우는 많지 않다.
> names(z) <- c("x","y")
> z
$x
[1] 1 2 3 4 5 6 7 8 9 10
$y
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
> z <- list(A=x,B=y)
> z
$A
[1] 1 2 3 4 5 6 7 8 9 10
$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
c("x","y")로 이름을 지정해주는 것 보다는 z <- list() 를 자주 쓴다.
> z$A
[1] 1 2 3 4 5 6 7 8 9 10
> z$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
리스트에서는 특별한 $기호를 사용하여 리스트를 구성하는 벡터를 추출할 수 있다.
이것은 아주 흔히 사용되기 때문에 반드시 알고 있어야 한다.
> z
$A
[1] 1 2 3 4 5 6 7 8 9 10
$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
> z[]
$A
[1] 1 2 3 4 5 6 7 8 9 10
$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
> z[1]
$A
[1] 1 2 3 4 5 6 7 8 9 10
> z[2]
$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
> z["A"]
$A
[1] 1 2 3 4 5 6 7 8 9 10
> z["B"]
$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
여러가지 방법으로 z값을 추출 할 수 있다.
위와 같은 방식들은 추출한 값들이 리스트로 유지되는 경우이다.
> z$A
[1] 1 2 3 4 5 6 7 8 9 10
> z$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
하지만 위의 경우는 아토믹 벡토로 값을 추출하기 때문에 엄연히 다르다.
> z[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> z[[2]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
> z[["A"]]
[1] 1 2 3 4 5 6 7 8 9 10
> z[["B"]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
[[]] 를 쓰면 []와 비슷하면서도 아토믹 벡터가 되게 할 수 있다.
정리하자면 이제 우리는 세 가지 종류의 서브세팅 연산자를 알게 되었다.
$ , [] ,[[]] 가 그것이다. 앞에서 사례로 본 내용을 다음과 같이 정리할 수 있다.
※ []는 리스트가 유지되고 $,[[]] 는 아토믹 벡터가 된다.
※ $ : 뒤의 이름을 프로그래밍 방법으로 줄 수 없다.
※ [] 또는 [[]] : 이름을 프로그래밍 방법으로 줄 수 있다.
다음 코드를 보자. x대신에 변수 a에 "A" 라는 문자열을 할당하고, 이 변수 a를 사용하여 추출을 시도하였다.
> a <- "A"
> z$a
NULL
> z[a]
$A
[1] 1 2 3 4 5 6 7 8 9 10
> z[[a]]
[1] 1 2 3 4 5 6 7 8 9 10
$는 R 콘솔에서 인터랙티브 모드에서 흔히 사용하고, xy요소의 세 번째 값에 접근해보자.
①먼저 B이름을 가진 벡터를 추출한다.
> z$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
> z[["B"]]
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
②아토믹 벡터를 얻었으므로 다시 여기에 인덱스를 사용한다.
> z$B[3]
[1] "C"
> z[["B"]][3]
[1] "C"
결론적으로는 z$B[3],z[["B"]][3]으로 해결된다. 만약 다음과 같이 하면 잘 되지 않을 것이다.
> z["B"][3]
$<NA>
NULL
왜냐하면 z["B"]는 새로운 리스트가 되는데, 아래서 보는 것처럼 이 리스트는 하나의 벡터로 되어있다.
그리고 z["B"][3]은 세 번째 벡터에 접근하라는 것이기 때문에 이것은 존재하지 않는다.(NULL)
> z["B"]
$B
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
우리가 만든 리스트 z는 같은 길이를 가지는 벡터로 구성되어 있다. 리스트는 서로 다른 타입의 데이터를 가질 수도 있고, 또 이들 벡터의 길이가 같을 필요도 없다. 앞에서는 길이를 조정하여 새로운 리스트 zz를 만들어 보았다.
> xx <- x //(1~10 까지 수 가 들어가 있는 벡터)
> yy <- y[-(1:7)] // 1~7 요소가 아닌 것들
> zz <- list(xx=xx,yy=yy)
> zz
$xx
[1] 1 2 3 4 5 6 7 8 9 10
$yy
[1] "H" "I" "J"
'전공 > R프로그래밍' 카테고리의 다른 글
R프로그래밍 10. R객체의 메타 데이터 : 속성 (0) | 2019.07.02 |
---|---|
R프로그래밍 9. 데이터 프레임 (0) | 2019.07.01 |
R프로그래밍 7. 규칙성을 가진 벡터 만들기 (0) | 2019.06.26 |
R프로그래밍 6. 벡터 서브세팅과 교체 (0) | 2019.06.24 |
R 프로그래밍 5. R의 패키지 시스템 (0) | 2019.06.14 |