在具有矩阵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 $为三个)会的工作,否则他们不会。
要对矩阵进行操作,你可以定义名称的列:
m[m[, "three"] == 11,]
或数字:
m[m[,3] == 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, ]
或者,你可以使用子命令。
我会选择使用dplyr包一个简单的方法。
如果数据帧的数据。
library(dplyr)
result <- filter(data, three == 11)
子是一个非常缓慢的功能,我个人觉得它没用。
我想你有一个data.frame,阵列,矩阵称为Mat
与A
, B
, C
列名; 那么所有你需要做的是:
在对不同列中的多个条件的情况下,你可以创建一个虚拟变量。 假设条件为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
方法比快10倍subset
的方法。