R: подмножество из матрицы только те строки с определенным значением в определенном столбце - PullRequest
2 голосов
/ 01 марта 2012

У меня есть большая матрица «dt» посещений отделения неотложной помощи в течение 2 месяцев для набора диагностических кодов. Столбцы: "возраст", "пол", "дата", "графство", "почтовый индекс", "субъектив", "позиция", "diag" и "dt"; размеры 872344 на 9.

Я хочу создать подмножество из этой матрицы и создать новую матрицу, содержащую только те строки, для которых столбец "diag" имеет число от 800 до 849 (все столбцы).

Я возился с созданием цикла и использованием "which" или "if.else", но я сталкиваюсь с ментальным блоком. Кажется, было бы проще, если бы это был только ОДИН код, который я хотел вытащить, но серия из 50 кодов усложняет ситуацию ... указывая на цикл? У кого-нибудь есть идеи о том, как использовать подмножество, основанное на поиске определенных значений?

Вот мой старт (это не сработало):

dta = dt
b = 800:849
for (i in 1:length(b)) {

}

Ответы [ 4 ]

6 голосов
/ 01 марта 2012
dta = dt[dt[, 8] >= 800 & dt[, 8] <= 849, ]

ETA: Вы уверены, что это матрица, а не датафрейм?Если это data.frame, вы можете сделать:

dta = dt[dt$diag >= 800 & dt$diag <= 849, ]
5 голосов
/ 01 марта 2012

Учитывая ваши имена столбцов, я подозреваю, что ваш dt - это data.frame, а не матрица; что-то, что вы можете подтвердить, запустив is.data.frame(dt).

Если это так, простой способ фильтрации ваших данных - использовать функцию subset следующим образом:

dta <- subset(dt, diag >= 800 & diag <= 849)
0 голосов
/ 26 февраля 2016

Я бы не конвертировал matrix() в data.frame(), так как он медленнее и потребляет больше памяти, в то время как операции matrix() в общем случае быстрее в любом случае.

В дополнение к ответу Дэвида с использованием номера столбцаиндексирование:

dta = dt[dt[,8] >= 800 & dt[,8] <= 849,]

Существует также форма, использующая индексирование имен столбцов с помощью матрицы:

dta = dt[dt[,'metric'] >= 800 & dt[,'metric'] <= 849,]

Как показано командой пакета microbenchmark для идентичной матрицы с 12 столбцами и13 241 строка с R, скомпилированным с оптимизацией Intel MKL:

microbenchmark::microbenchmark(
     test.matrix     = mt[mt[,3] %in% 5:10 & mt[,5] == 1,],
     test.data.frame = df[df[,3] %in% 5:10 & df[,5] == 1,],
     times = 1000
     )

Unit: microseconds
            expr      min       lq     mean  median        uq        max neval
 test.matrix      885.732  938.386 1154.898  943.74  952.4415 138215.318  1000
 test.data.frame 1176.218 1245.826 1363.379 1258.32 1286.4320 3392.556    1000

Когда матрицы становятся очень большими, эта разница становится ощутимой.На моей машине скорость индексирования матриц выше, чем у data.table.

0 голосов
/ 13 ноября 2015

В дополнение к превосходным ответам выше, я могу добавить filter функцию в dpylr упаковке

filter(dt,diag>=800 & diag <= 849)

filter() аналогично subset(), за исключением того, что вы можете задать ему любое количество условий фильтрации, которые объединяются вместе с & (не &&, что легко сделать случайно!). В пакете dpylr есть и другие полезные функции для работы с данными, которые вы можете посмотреть.

...