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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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, ]

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

Ответ 3

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

Если dataframe является данными.

library(dplyr)
result <- filter(data,data$three == 11)

Ответ 4

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

R> m[m$three == 11, ]

Ответ 5

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

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