2013-04-25 4 views
1

У меня есть матрица, как это в R:разделить матрицу в матрицах по значению узлов столбца в R

  [,1]  [,2]  [,3]   [,4]   [,5] 
19992 -33.54971 23.35746 0.0000000 2.107680e+01 19980219 
19993 -33.54203 23.40079 0.0000000 2.107696e+01 19980219 
19994 -33.53453 23.44445 0.0000000 2.107713e+01 19980219 
19995 -33.52719 23.48840 0.0000000 2.107730e+01 19980219 
19996 -33.51965 23.53200 0.0000000 2.107746e+01 19980219 
19997 -33.51183 23.57565 0.0000000 2.107763e+01 19980219 
19998 -33.50446 23.61958 0.0000000 2.107780e+01 19980219 
19999 -33.49678 23.66313 0.0000000 2.107796e+01 19980219 

Ее на самом деле намного больше (2.000.000 строк), но я думаю, что этот пример будет сделайте для моего вопроса.

Я хочу извлечь все строки, которые имеют значение между, например, -33.52 ... и -33.55 ... в первом столбце и создайте новую матрицу из этих выделенных строк.

Выходная матрица будет не быть, например:

19992 -33.54971 23.35746 0.0000000 2.107680e+01 19980219 
19993 -33.54203 23.40079 0.0000000 2.107696e+01 19980219 
19994 -33.53453 23.44445 0.0000000 2.107713e+01 19980219 
19995 -33.52719 23.48840 0.0000000 2.107730e+01 19980219 

Некоторые советы было бы здорово!

ответ

1

Используя данные, мы можем сделать что-то вроде этого

txt <- 
" -33.54971 23.35746 0.0000000 2.107680e+01 19980219 
-33.54203 23.40079 0.0000000 2.107696e+01 19980219 
-33.53453 23.44445 0.0000000 2.107713e+01 19980219 
-33.52719 23.48840 0.0000000 2.107730e+01 19980219 
-33.51965 23.53200 0.0000000 2.107746e+01 19980219 
-33.51183 23.57565 0.0000000 2.107763e+01 19980219 
-33.50446 23.61958 0.0000000 2.107780e+01 19980219 
-33.49678 23.66313 0.0000000 2.107796e+01 19980219" 

mat <- matrix(scan(text = txt), ncol = 5, byrow = TRUE) 
cond <- mat[,1] < -33.52 & mat[,1] > -33.55 
mat[cond, ] 

##   [,1] [,2] [,3] [,4]  [,5] 
## [1,] -33.550 23.357 0 21.077 19980219 
## [2,] -33.542 23.401 0 21.077 19980219 
## [3,] -33.535 23.444 0 21.077 19980219 
## [4,] -33.527 23.488 0 21.077 19980219 
+0

Упс! Я думаю, что это правильный ответ (от -33,52 до -33,55) – Arun

+0

Thats it! Thx для помощи и быстрых респонов dickoa и других! – MB123

+0

Добро пожаловать! спасибо другим тоже :) – dickoa

2

Предположим, что ваша оригинальная матрица называется the_matrix. Для получения тех индексов подряд, значения которых в первом столбце в указанном диапазоне можно использовать

ind <- which(the_matrix[, 1] < -33.52 & the_matrix[, 1] > -33.55) 

Чтобы создать новую матрицу только с этими строками, используйте

new_matrix <- the_matrix[ind, ] 
+0

+1 основном то же самое, как мое решение –

+1

sieste. Сравнение должно быть другим. Проверьте ответ @ dickoa. то есть> -33.55 и <-33.52. – Arun

+0

@Arun: Спасибо, я отредактировал свой ответ. – sieste

2

Используйте логическое сравнение, которое вы можете использовать для подмножества, как это:

set.seed(1096) 
m <- matrix(runif(36,-30,30) , ncol = 6) 
m 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] -10.8645147 12.701539 11.830714 12.027012 13.007876 -27.569211 
[2,] -27.7127809 -20.907217 26.667036 -16.142388 20.287297 12.283898 
[3,] 8.1607388 13.326040 -8.937501 2.541782 2.705917 18.490514 
[4,] 14.0729963 4.522238 13.869731 13.708621 -22.996189 29.276250 
[5,] -0.3717591 18.057403 18.940814 3.430272 -23.460082 -27.296111 
[6,] -14.0079398 -7.932984 24.836415 -20.442637 20.630987 8.138304 

m[ m[,1] > -15 & m[,1] < -10 , ] 
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] -10.86451 12.701539 11.83071 12.02701 13.00788 -27.569211 
[2,] -14.00794 -7.932984 24.83641 -20.44264 20.63099 8.138304 

Мы ставим условие подмножество на в положении строк в операторе [ (обратите внимание на , после т он заключает в последней команде выше, без ничего после этого мы говорим, что R возвращает все столбцы).

Мы добавляем наши условия для подмножества в обиходе & оператора к условиям цепи вместе, поэтому в данном случае мы хотим строку со значениями в первом столбце (m[,1]), которые больше -15 & меньше, чем -10.

Можно сказать,

m[ (some condition) , c(1,2) ] 

(some condition) И если это выражение, которое R можно оценить либо TRUE или FALSE он будет возвращать только те строки, которые оценивают в TRUE. И на этот раз мы просим только колонках 1 и 2 (мы могли бы также сказать 1:2)

+0

(+1). нет необходимости в 'which' здесь. – Arun

+0

@Arun спасибо. Я добавил еще несколько объяснений, потому что я хочу, чтобы ответ был более полезным для других, которые хотят понять этот простой подмножество. –

+0

Очень приятное использование '>' с -15 и '<' с -10, таким образом, заботясь о знаках. – Arun

Смежные вопросы