R
R List indexing
(이경수)
2021. 4. 21. 11:05
아래 예시에서 x는 a, b라는 이름의 벡터로 구성된 리스트이다. a는 숫자형(numeric), b는 문자형(character) 데이터이다. list의 각 요소에 접근하여 데이터를 수정하거나 삭제해야 한다면 [ ]를 두 번 겹쳐서 x[[1]], x[[2]]와 같이 나타내면 된다. 더 세부적으로 리스트의 첫번째 인자에서 k번째 데이터의 접근은 x[[1]][k]와 같이 나타내면 된다.
> x <- list(a=c(1,2,3), b=c("y","n","y"))
> x
$a
[1] 1 2 3
$b
[1] "y" "n" "y"
> x[[1]] <- c(4,5,6)
> x
$a
[1] 4 5 6
$b
[1] "y" "n" "y"
> x[[1]][2:3] <- c(7,8)
> x
$a
[1] 4 7 8
$b
[1] "y" "n" "y"
마찬가지로 list에서 2번째 요소의 2번째 데이터는 x[[2]][2]와 같이 접근하면 되겠다.
> x[[2]][2] <- "y"
> x
$a
[1] 4 7 8
$b
[1] "y" "y" "y"
데이터에 접근하는 또다른 방법은 '$'를 이용하는 것이다. x$a는 x[[1]]와 같은 의미이다.(list x의 첫번째 요소의 이름이 a이다.)
> x$a <- c(11,12,13)
> x
$a
[1] 11 12 13
$b
[1] "y" "y" "y"
그러면 x[1]과 x[[1]]은 어떤 차이를 갖는 것일까?
> x[1]
$a
[1] 11 12 13
> x[[1]]
[1] 11 12 13
datatype을 확인해 보니, x[[1]]는 numeric, x[1]는 list이다. 'x[1] <- c(4,5,6)'는 list에 numeric형 자료를 넣는 표현으로 경고 메시지가 뜨게 만든다. 괄호를 하나만 쓰고자 할 때는 x[1] <- list(c(1,2,3)) 와 같이 표현하는 것이 맞겠다.
> class(x[[1]])
[1] "numeric"
> class(x[1])
[1] "list"
> x[[1]] <- c(1,2,3)
> x
$a
[1] 1 2 3
$b
[1] "y" "y" "y"
> x[1] <- c(4,5,6)
경고메시지(들):
In x[1] <- c(4, 5, 6) :
number of items to replace is not a multiple of replacement length
> x[1] <- list(c(1,2,3))
> x
$a
[1] 1 2 3
$b
[1] "y" "y" "y"