簡體   English   中英

選擇滿足條件的矩陣行

[英]Select rows of a matrix that meet a condition

在帶有矩陣的 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

我想提取其行具有第三列 = 11 的子矩陣。即:

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

我想在不循環的情況下做到這一點。 我是 R 的新手,所以這可能非常明顯,但文檔通常有些簡潔。

如果您使用 as.data.frame() 將矩陣轉換為數據框,這將更容易做到。 在這種情況下,先前的答案(使用子集或 m$three)將起作用,否則將不起作用。

要對矩陣執行操作,您可以按名稱定義列:

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

或按編號:

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

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

我將選擇使用 dplyr 包的簡單方法。

如果數據幀是數據。

library(dplyr)
result <- filter(data, three == 11)
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, ]

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

Subset 是一個非常慢的函數,我個人覺得它沒用。

我假設您有一個名為Mat的 data.frame、array、矩陣,其中ABC作為列名; 那么你需要做的就是:

  • 在一列上有一個條件的情況下,假設列 A

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

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

如果您的矩陣稱為m ,只需使用:

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

如果數據集被稱為數據,那么所有滿足列 'pm2.5' > 300 的值的行都可以通過 -

數據[數據['pm2.5']>300,]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM