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

149

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

peter2108
источник
4
Основная идея в каждом ответе заключается в том, что если у вас есть логический вектор / матрица (ИСТИНА и ЛОЖЬ) той же длины, что и некоторый индекс, вы выберете только те случаи, которые ИСТИННЫ. Введите коды между [ ]ответами, и вы увидите это более четко.
Саша Эпскэмп,

Ответы:

164

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

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

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

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

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

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

Neilfws
источник
19
если вам нужно сохранить матрицу, то сделайте этоm[m[,3] == 11,,drop=FALSE]
Джорис Мейс
@neilfws Каким будет решение, если я хочу определить некоторые значения для диапазона столбцов. например df <- df[!which(df$ARID3A:df$YY1 == "U"),], здесь я хочу , чтобы удалить эти строки из моего ФРА , где диапазон колонка (ARID3A: YY1) содержит значение U .
Newbie
Как это работает, если вы вообще не хотите указывать имена столбцов, но хотите работать со всеми столбцами в матрице?
user5359531
Привет, @neilfws, как ты можешь добавить к нему оператор &&? Мне нужно получить значения двух столбцов одновременно?
отладка XD
29
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, ]

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

Джон
источник
26

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

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

library(dplyr)
result <- filter(data, three == 11)
Мавез ДАБАС
источник
12

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

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

Мохамад Эльмасри
источник
7

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

R> m[m$three == 11, ]
Джуба
источник
@juba Каким будет решение, если я хочу определить некоторые значения для диапазона столбцов. например df <- df[!which(df$ARID3A:df$YY1 == "U"),], здесь я хочу удалить те строки из моего df, где диапазон столбцов (ARID3A: YY1) содержит значениеU
Newbie
0

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

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

Анвита Шукла
источник