developer tip

벡터 / 행렬 끝까지 우아한 인덱싱

optionbox 2020. 11. 18. 08:55
반응형

벡터 / 행렬 끝까지 우아한 인덱싱


R에서 말할 수 i있습니까? 위치 에서 벡터 / 행렬의 끝까지 모든 인덱스를 원합니까? 3 번째 열부터 부분 행렬을 원한다고 가정 해 보겠습니다. 나는 현재이 방법으로 만 알고 있습니다.

A = matrix(rep(1:8, each = 5), nrow = 5) # just generate some example matrix...

A[,3:ncol(A)] # get submatrix from 3rd column onwards

하지만 정말 써야 ncol(A)하나요? "3 번째 열부터"라고 말하는 우아한 방법이 없나요? 같은 뭔가 A[,3:]? (또는 A[,3:...])?


때로는 원하지 않는 것을 R에게 알리는 것이 더 쉽습니다 . 즉, 음의 인덱싱을 사용하여 행렬에서 열을 제외합니다.

둘 다 동일한 결과를 생성하는 두 가지 대체 방법은 다음과 같습니다.

A[, -(1:2)]
A[, -seq_len(2)]

결과 :

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    4    5    6    7    8
[2,]    3    4    5    6    7    8
[3,]    3    4    5    6    7    8
[4,]    3    4    5    6    7    8
[5,]    3    4    5    6    7    8

그러나 질문에 답하려면 : ncol열 수를 찾는 데 사용 합니다. (비슷하게 nrow행 수를 찾는 것이 있습니다.)

A[, 3:ncol(A)]

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    4    5    6    7    8
[2,]    3    4    5    6    7    8
[3,]    3    4    5    6    7    8
[4,]    3    4    5    6    7    8
[5,]    3    4    5    6    7    8

다음 행 (다른 예에 따라 열)의 경우 head()tail()활용 될 수있다.

A <- matrix(rep(1:8, each = 5), nrow = 5)
tail(A, 3)

거의 같다

A[3:dim(A)[1],]

(인쇄 된 행 이름 / 인덱스는 모두 다릅니다).

벡터 및 데이터 프레임에서도 작동합니다.

> tail(1:10, 4)
[1]  7  8  9 10
> tail(data.frame(A = 1:5, B = 1:5), 3)
  A B
3 3 3
4 4 4
5 5 5

열 버전의 경우 조정할 수 tail()있지만 조금 까다 롭습니다. 나는 궁금 NROW()하고 NCOL()보다는, 여기에 유용 할 수 있습니다 dim()?

> A[, 3:NCOL(A)]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    4    5    6    7    8
[2,]    3    4    5    6    7    8
[3,]    3    4    5    6    7    8
[4,]    3    4    5    6    7    8
[5,]    3    4    5    6    7    8

또는 이것을 머리에 대고 R에게 물건을 묻는 대신 물건을 떨어 뜨려달라고 요청하십시오. 이를 캡슐화하는 함수는 다음과 같습니다.

give <- function(x, i, dimen = 1L) {
    ind <- seq_len(i-1)
    if(isTRUE(all.equal(dimen, 1L))) { ## rows
        out <- x[-ind, ]
    } else if(isTRUE(all.equal(dimen, 2L))) { ## cols
        out <- x[, -ind]
    } else {
        stop("Only for 2d objects")
    }
    out
}

> give(A, 3)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    1    2    3    4    5    6    7    8
[3,]    1    2    3    4    5    6    7    8
> give(A, 3, dimen = 2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    3    4    5    6    7    8
[2,]    3    4    5    6    7    8
[3,]    3    4    5    6    7    8
[4,]    3    4    5    6    7    8
[5,]    3    4    5    6    7    8

다음 지침을 사용할 수 있습니다.

A[, 3:length(A[, 1])]

참고 URL : https://stackoverflow.com/questions/7500644/elegant-indexing-up-to-end-of-vector-matrix

반응형