2012-03-01 69 views
2

對於一組診斷代碼,我有一個超過2個月的急診科訪問的大矩陣「dt」。欄目爲「年齡」,「性別」,「日期」,「縣」,「郵編」,「主題」,「位置」,「診斷」和「dt」;尺寸是872344乘以9.R:從矩陣子集只有那些在某一列中具有一定值的行

我想從這個矩陣的子集,並創建一個新的矩陣,只包含那些「診斷」列的數字介於800和849(所有列)之間的行。

我一直在搞建設一個循環,並使用「哪些」或「if.else」,但我遇到了一個心理障礙。如果它只是我想要拔出的一個diag代碼,似乎會更容易些,但是50系列代碼複雜化了一些東西......指向一個循環?有沒有人有基於查找某些值如何子集的想法?

這裏是我開始(沒有工作):

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

} 

回答

5

鑑於列名,我懷疑你的dt是一個data.frame,而不是一個矩陣;您可以通過運行is.data.frame(dt)進行確認。

如果是這種情況,一個簡單的方法來過濾你的數據是使用subset功能如下:

dta <- subset(dt, diag >= 800 & diag <= 849) 
+0

你是對的 - 它是一個數據框。我想我從來沒有理解R語言的差異。謝謝! – mEvans 2012-03-01 03:17:08

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

ETA:你確定這是一個矩陣,而不是一個data.frame?如果它是一個data.frame,你可以這樣做:

dta = dt[dt$diag >= 800 & dt$diag <= 849, ] 
0

除了上述優秀的答案,我可以添加filter功能dpylr

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

filter()類似,除了可以給它的任何數量的過濾條件,其與&接合在一起subset()(未&&這很容易意外!)。 dpylr包也有其他不錯的數據操作功能,你可以看看。

0

我不會將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編譯與英特爾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

相關問題