2011-03-22 218 views
99

在R 2與一個矩陣的矩陣的選擇的行:在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 

我想提取其行具有柱3 = 11。即子矩陣:

 one two three four 
[1,] 1 6 11 16 
[3,] 3 8 11 18 
[4,] 4 9 11 19 

我想這樣做沒有循環。我是R新手,所以這可能非常明顯,但文檔通常略顯簡單。

+3

在每一個答案,基本的想法是,如果你有相同的長度,一些指標的邏輯向量/矩陣(TRUEs和FALSEs),你會只選擇是真實的情況。在答案中運行'[]'之間的代碼,你會更清楚地看到這一點。 – 2011-03-22 14:36:03

+2

+1「文檔簡潔」。 – appleLover 2013-12-21 14:23:30

回答

114

這是比較容易,如果你使用as.data.frame轉換您的矩陣的數據幀做()。在這種情況下,以前的答案(使用子集或m $ 3)將起作用,否則它們不會。

要在矩陣執行的操作,您可以通過名稱定義列:

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

或數字:

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

注意,如果只有一行匹配,結果是一個整數向量,而不是一個矩陣。

+11

如果你需要保持矩陣,那麼做'm [m [,3] == 11,drop = FALSE]' – 2011-03-22 15:58:33

+0

非常感謝所有的響應者 - 對於延遲確認,抱歉,stackoverflow通知電子郵件地址錯了! – peter2108 2011-03-24 16:21:06

+0

@neilfws如果我想爲一系列的列定義一些值,那麼解決方案是什麼?例如'df < - df [!which(df $ ARID3A:df $ YY1 ==「U」),]',這裏我想從我的df中刪除那些行,其中列的範圍(ARID3A:YY1)包含值* U *。 – Newbie 2016-07-22 07:53:46

4

如果你的矩陣稱爲m,只需使用:

R> m[m$three == 11, ] 
+3

這將適用於數據幀,但不適用於矩陣。 – neilfws 2011-03-22 13:05:02

+0

@juba如果我想爲一系列的列定義一些值,那麼解決方案是什麼?例如'df < - df [!which(df $ ARID3A:df $ YY1 ==「U」),]',這裏我想從我的df中刪除那些行,其中列的範圍(ARID3A:YY1)包含值'U' – Newbie 2016-07-22 07:55:06

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

選擇或者,您可以使用子命令。

4

子集是一個非常慢的功能,我個人覺得它沒用。

我假設你有一個數據幀,數組,矩陣Mat,其中AB,C作爲列名;那麼所有你需要做的是:

  • 在一列上一個條件的情況下,可以說A列

    Mat[which(Mat[,'A'] == 10), ] 
    

在不同列中的多個條件的情況下,可以創建一個虛擬變量。假設條件是A = 10B = 5C > 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方法比subset方法快10倍。

10

我會選擇一個簡單的方法使用dplyr包。

如果數據幀是數據。

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