Выберите строки матрицы, которые удовлетворяют условию - PullRequest
121 голосов
/ 22 марта 2011

В Р с матрицей:

     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, так что это, вероятно, очень очевидно, но документация часто несколько лаконична.

Ответы [ 6 ]

139 голосов
/ 22 марта 2011

Это проще сделать, если вы преобразуете свою матрицу во фрейм данных с помощью as.data.frame ().В этом случае предыдущие ответы (с использованием подмножества или m $ three) будут работать, в противном случае они не будут работать.

Чтобы выполнить операцию с matrix , вы можете определить столбец по имени:

m[m[, "three"] == 11,]

Или по номеру:

m[m[,3] == 11,]

Обратите внимание, что если совпадает только одна строка, результатом является целочисленный вектор, а не матрица.

26 голосов
/ 22 марта 2011
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, ]

Или вы можете использоватькоманда подмножества.

18 голосов
/ 10 июня 2015

Я выберу простой подход, используя пакет dplyr.

Если фрейм данных - это данные.

library(dplyr)
result <- filter(data, three == 11)
11 голосов
/ 31 августа 2011

Подмножество - очень медленная функция, и я лично считаю ее бесполезной.

Я предполагаю, что у вас есть data.frame, массив, матрица с именем 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.

5 голосов
/ 22 марта 2011

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

R> m[m$three == 11, ]
0 голосов
/ 01 июня 2019

Если набор данных называется данными, то все строки, удовлетворяющие условию, при котором значение столбца 'pm2.5'> 300 может быть получено -

данные [данные ['pm2.5']> 300,]

...