Виберіть рядки матриці, які відповідають умові


144

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


4
Основна ідея кожної відповіді полягає в тому, що якщо у вас є логічний вектор / матриця (TRUEs і FALSEs) тієї ж довжини, що і деякий індекс, ви виберете лише випадки, які є ІСТИНИМИ. Запустіть коди між [ ]відповідями, і ви побачите це чіткіше.
Sacha Epskamp

Відповіді:


160

Це простіше зробити, якщо ви перетворите матрицю в кадр даних, використовуючи as.data.frame (). У такому випадку попередні відповіді (з використанням підмножини або m $ три) спрацюють, інакше вони не будуть.

Для виконання операції над матрицею можна визначити стовпець за назвою:

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

Або за номером:

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

Зауважте, що якщо відповідає лише один рядок, результат є цілим вектором, а не матрицею.


19
якщо вам потрібно зберегти матрицю, то зробітьm[m[,3] == 11,,drop=FALSE]
Joris Meys

@neilfws Що буде рішенням, якщо я хочу визначити деякі значення для діапазону стовпців. наприклад df <- df[!which(df$ARID3A:df$YY1 == "U"),], тут я хочу , щоб видалити ці рядки з мого ФРА , де діапазон колонка (ARID3A: YY1) містить значення U .
Новачок

Як це працює, якщо ви взагалі не хочете вказувати назви стовпців, але хочете працювати над усіма стовпцями в матриці?
користувач5359531

Привіт @neilfws, як ви можете додати && заяву до цього? Мені потрібно отримати два значення стовпців одночасно?
налагодження XD

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

Або ви можете використовувати команду підмножини.


21

Я виберу простий підхід, використовуючи пакет dplyr.

Якщо кадр даних - це дані.

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

11

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

Я припускаю , що у вас є 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метод.


6

Якщо ваша матриця викликана 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,]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.