Выберите строки матрицы, соответствующие условию
в R с матрицей:
one two three four
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 11 18
[4,] 4 9 11 19
[5,] 5 10 15 20
Я хочу извлечь подматрицу, строки которой имеют столбец три = 11. То есть:
one two three four
[1,] 1 6 11 16
[3,] 3 8 11 18
[4,] 4 9 11 19
Я хочу сделать это без зацикливания. Я новичок в R, так что это, вероятно, очень очевидно, но документация часто бывает несколько краткой.
5 ответов:
это легче сделать, если вы преобразуете свою матрицу в фрейм данных с помощью as.данные.рамка.)( В этом случае предыдущие ответы (с использованием подмножества или m$three) будут работать, иначе они не будут.
для выполнения операции на матрица, вы можете определить столбец по имени:
m[m[, "three"] == 11,]
или по номеру:
m[m[,3] == 11,]
обратите внимание, что если соответствует только одна строка, результатом является целочисленный вектор, а не матрица.
m <- matrix(1:20, ncol = 4) colnames(m) <- letters[1:4]
следующая команда выберет первую строку матрицы выше.
subset(m, m[,4] == 16)
и это будет выбрать последние три.
subset(m, m[,4] > 17)
результатом будет матрица в обоих случаях. Если вы хотите использовать имена столбцов для выбора столбцов, то вам лучше всего преобразовать его в фрейм данных с помощью
mf <- data.frame(m)
затем вы можете выбрать с
mf[ mf$a == 16, ]
или, вы можете использовать команду подмножество.
Я выберу простой подход, используя пакет dplyr.
Если фрейм данных-это данные.
library(dplyr) result <- filter(data, three == 11)
подмножество-это очень медленная функция , и я лично считаю его бесполезным.
я предполагаю, что у вас есть данные.фрейм, массив, матрица называется
Mat
СA
,B
,C
как имена столбцов; тогда все, что вам нужно сделать, это:
в случае одного условия на один столбец, скажем столбец a
Mat[which(Mat[,'A'] == 10), ]
в случае нескольких условий в разных столбцах можно создать фиктивную переменную. Предположим, что условия являются
A = 10
,B = 5
иC > 2
, тогда у нас есть:aux = which(Mat[,'A'] == 10) aux = aux[which(Mat[aux,'B'] == 5)] aux = aux[which(Mat[aux,'C'] > 2)] Mat[aux, ]
путем испытывать преимущество скорости с
system.time
наwhich
метод в 10 раз быстрее, чемsubset
метод.