在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的新手所以这可能非常明显但是 文档通常有些简洁。
答案 0 :(得分:138)
如果使用as.data.frame()将矩阵转换为数据框,则更容易实现。在这种情况下,先前的答案(使用子集或m $ 3)将起作用,否则他们不会。
要在矩阵上执行操作,您可以按名称定义列:
m[m[, "three"] == 11,]
或按号码:
m[m[,3] == 11,]
请注意,如果只有一行匹配,则结果是整数向量,而不是矩阵。
答案 1 :(得分:26)
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命令。
答案 2 :(得分:17)
我将使用dplyr包选择一种简单的方法。
如果数据框是数据。
shared_ptr
答案 3 :(得分:10)
子集是一个非常慢的功能,我个人觉得它没用。
我假设您有一个名为Mat
的data.frame,数组,矩阵,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倍。
答案 4 :(得分:5)
如果您的矩阵被称为m
,请使用:
R> m[m$three == 11, ]
答案 5 :(得分:0)
如果数据集被称为数据,那么满足条件的所有行都可以通过-接收列'pm2.5'> 300的值
data [data ['pm2.5']> 300,]