Выберите строки матрицы, соответствующие условию


в 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 109

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)

Если ваша матрица называется m, например :

R> m[m$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 метод.