2013-04-25 54 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 2013-04-25 14:08:44

+0

那就是它! Thx的幫助和快速respsonses dickoa和其他人! – MB123 2013-04-25 14:35:39

+0

歡迎你!感謝其他人:) – dickoa 2013-04-25 14:49:02

2

假設您的原始矩陣被稱爲the_matrix。爲了獲得這些行索引,其值在第一列在指定的範圍內,你可以使用

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

要創建只有這些行新的矩陣,使用

new_matrix <- the_matrix[ind, ] 
+0

+1基本上都是同樣的事情,我的解決方案 – 2013-04-25 13:50:55

+1

sieste,比較應該是另一種方式。檢查@ dickoa的答案。即> -33.55和<-33.52。 – Arun 2013-04-25 14:10:02

+0

@阿倫:謝謝,我編輯了我的答案。 – sieste 2013-04-25 14:40:15

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])是低於-10小於大於-15 &值的行。

你可能會說

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

如果(some condition)條件是,R取值爲TRUEFALSE表達它只會返回計算結果爲TRUE行。而這個時候,我們要求只有 1和2列(我們也可以說1:2

+0

(+1)。這裏不需要'哪個'。 – Arun 2013-04-25 14:02:54

+0

@阿倫謝謝。我添加了一些更多的解釋,因爲我希望對於想要了解這種簡單子集的人更加有用。 – 2013-04-25 14:04:40

+0

非常好用'''用-15和'<'用-10,從而照顧標誌。 – Arun 2013-04-25 14:12:08