programing

벡터/매트릭스 끝까지 우아한 인덱싱

bestprogram 2023. 10. 19. 22:39

벡터/매트릭스 끝까지 우아한 인덱싱

R에서 모든 지수를 위치에서 원하는 것으로 말할 수 있습니까?i벡터/matrix의 끝까지?세 번째 열부터 서브매트릭스를 원한다고 하세요.저는 현재 이 방법만 알고 있습니다.

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],]

(이름/인쇄된 indices이 모두 다릅니다.)

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

> 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])]

동일한 것에 대해 적용자가 읽을 수 있는 갱신된 접근 방식:

A %>% as_tibble() %>%
  select(-c(V1,V2))
  
A %>% as_tibble() %>%
  select(V3:ncol(A))

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