В 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
.