Элегантное индексирование до конца вектора / матрицы - PullRequest
64 голосов
/ 21 сентября 2011

Можно ли в 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:...])?

Ответы [ 3 ]

85 голосов
/ 21 сентября 2011

Иногда проще сказать 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
16 голосов
/ 21 сентября 2011

Для строк (не для столбцов, как в вашем примере) можно использовать 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
1 голос
/ 15 июня 2018

Вы можете использовать следующую инструкцию:

A[, 3:length(A[, 1])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...