pet*_*108 128 select r matrix submatrix
在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
Run Code Online (Sandbox Code Playgroud)
我想提取其行有第三列= 11的子矩阵.这是:
one two three four
[1,] 1 6 11 16
[3,] 3 8 11 18
[4,] 4 9 11 19
Run Code Online (Sandbox Code Playgroud)
我想在没有循环的情况下这样做.我是R的新手,所以这可能非常明显,但文档往往有些简洁.
nei*_*fws 145
如果使用as.data.frame()将矩阵转换为数据框,则更容易做到这一点.在这种情况下,先前的答案(使用子集或m $ 3)将起作用,否则他们不会.
要对矩阵执行操作,可以按名称定义列:
m[m[, "three"] == 11,]
Run Code Online (Sandbox Code Playgroud)
或者通过数字:
m[m[,3] == 11,]
Run Code Online (Sandbox Code Playgroud)
请注意,如果只有一行匹配,则结果是整数向量,而不是矩阵.
Joh*_*ohn 26
m <- matrix(1:20, ncol = 4)
colnames(m) <- letters[1:4]
Run Code Online (Sandbox Code Playgroud)
以下命令将选择上面矩阵的第一行.
subset(m, m[,4] == 16)
Run Code Online (Sandbox Code Playgroud)
这将选择最后三个.
subset(m, m[,4] > 17)
Run Code Online (Sandbox Code Playgroud)
在两种情况下,结果都是矩阵.如果要使用列名来选择列,那么最好将其转换为带有的数据帧
mf <- data.frame(m)
Run Code Online (Sandbox Code Playgroud)
然后你可以选择
mf[ mf$a == 16, ]
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用subset命令.
小智 19
我将使用dplyr包选择一种简单的方法.
如果数据帧是数据.
library(dplyr)
result <- filter(data, three == 11)
Run Code Online (Sandbox Code Playgroud)
Moh*_*sri 11
子集是一个非常慢的功能,我个人觉得它没用.
我假设你有一个data.frame,阵列,矩阵称为Mat
有A
,B
,C
列名; 那么你需要做的就是:
如果一列上有一个条件,请说A列
Mat[which(Mat[,'A'] == 10), ]
Run Code Online (Sandbox Code Playgroud)在不同列的多个条件的情况下,您可以创建一个虚拟变量.假设条件是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, ]
Run Code Online (Sandbox Code Playgroud)
通过测试速度优势system.time
,该which
方法比subset
方法快10倍.
如果你的矩阵被调用m
,只需使用:
R> m[m$three == 11, ]
Run Code Online (Sandbox Code Playgroud)