[英]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、矩陣,其中A
、 B
、 C
作為列名; 那么你需要做的就是:
在一列上有一個條件的情況下,假設列 A
Mat[which(Mat[,'A'] == 10), ]
在不同列有多個條件的情況下,您可以創建一個虛擬變量。 假設條件是A = 10
, B = 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.