Я следил за учебным пособием https://www.datamentor.io/r-programming/matrix/ о языке R о том, как сохранить возвращенную матрицу после индексации матрицы вместо вектора. Однако это не работает, и класс возвращаемой матрицы по-прежнему является вектором.
Я пытался использовать одну запятую, затем две запятые, как показано в уроке.
[1] 3 6 9
> class(x[x%%3==0])
[1] "integer"
> x[x%%3==0, drop=FALSE]
[1] 3 6 9
> class(x[x%%3==0, drop=FALSE])
[1] "integer"
> x[x%%3==0,, drop=FALSE]
Error in x[x%%3 == 0, , drop = FALSE] :
(subscript) logical subscript too long
> x[x%%3==0,,.drop=FALSE]
Error in x[x%%3 == 0, , .drop = FALSE] : incorrect number of dimensions
> x[x%%3==0,,drop=FALSE]
Error in x[x%%3 == 0, , drop = FALSE] :
(subscript) logical subscript too long
> class(x[x%%3==0, drop=FALSE])
[1] "integer"
Класс по-прежнему целочисленный, а не матричный, что и предполагается делать с помощью drop=FALSE.
Вам нужно x[rowSums(x%%3==0) == 3, , drop = FALSE]
Результат
x %% 3==0
# A B C
#X FALSE FALSE FALSE
#Y FALSE FALSE FALSE
#Z TRUE TRUE TRUE
является логической матрицей
Подстановка исходной матрицы с использованием логической матрицы дает элементы на основе положения TRUE
which(x%%3 == 0)
#[1] 3 6 9
Это те же значения в matrix
, которые мы получили при извлечении, и это не различает строки, например.
x > 3
# A B C
#X FALSE TRUE TRUE
#Y FALSE TRUE TRUE
#Z FALSE TRUE TRUE
x[x > 3]
#[1] 4 5 6 7 8 9
Чтобы извлечь строку как таковую, нам может понадобиться получить логический вектор. Один из вариантов rowSums
и сравнить с количеством столбцов
x[rowSums(x %%3 == 0) == ncol(x),, drop = FALSE]
# A B C
#Z 3 6 9
x <- matrix(1:9, nrow = 3, dimnames = list(c("X","Y","Z"), c("A","B","C")))
Но что нам делать, если для матрицы установлено значение byrow=TRUE? Я попробовал это, когда я установил матрицу в byrow = TRUE, и вся комбинация между rowSums, colSums и nrow, ncol не будет работать.
@ user39178 Не уверен, что вы имели в виду.
Это так > x <- matrix(1:9, nrow = 3, byrow=TRUE, dimnames = list(c("X","Y","Z"), c("A","B","C"))) > x[rowSums(x%%3==0)==ncol(x),,drop=FALSE] A B C > x[colSums(x%%3==0)==ncol(x),,drop=FALSE] A B C Z 7 8 9 > x[rowSums(x%%3==0)==nrow(x),,drop=FALSE] A B C > x[colSums(x%%3==0)==nrow(x),,drop=FALSE] A B C Z 7 8 9
@user39178 user39178 Вы можете проверить вывод x%%3 == 0
там есть только один столбец «C». В таком случае я не знаю, каковы ваши критерии подмножества. Если это подмножество столбца «C», x[, colSums(x%%3 == 0)== ncol(x), drop = FALSE]
когда я это делаю, на выходе остается строка 3 6 9
@user39178 user39178 Для меня это получение матрицы с одним столбцом
Обратите внимание, что когда вы делаете
x %%3 == 0
с матрицей/данными/кадром, на выходе получается логическая матрица. Вы передаете это как индекс строки