R:在不使用2d索引语法的情况下获取矩阵行

时间:2015-04-19 20:56:55

标签: r matrix indexing

我有一个看起来如下的矩阵:

> train.y.class[1:2,]
     Class_1 Class_2 Class_3 Class_4 Class_5 Class_6 Class_7 Class_8 Class_9
[1,]       1       0       0       0       0       0       0       0       0
[2,]       0       0       0       0       1       0       0       0       0

然后传递给R函数tune,它将对可能的模型参数执行网格搜索。为了做到这一点,它定期切片这些数据并将其传递给模型。这些切片是它开始分解的地方;它有点像

do.call(model, x, y[1:n], ...)

...而y[1:n]返回n个元素的向量,而不是想要的n x 9矩阵。也就是说,我需要看起来像上面的矩阵,但我得到这样的东西:

> train.y.class[1:2]
[1] 1 0

由于我无法访问此库代码,我的问题是是否可以将我的矩阵重新格式化为允许形式为y.new[1:n]的切片的结构,其结果与y.old[1:n,]相同,即一个nx 9矩阵。如果你愿意的话,这是一个聪明的黑客。

如果答案是否定的,您能提出替代解决方案吗?我已经尝试了替代数据表示(不是矩阵)和模型包装器的组合,但我还没有完全重新格式化参数然后调用包装函数。

1 个答案:

答案 0 :(得分:0)

y[1:n, ]将返回一个n x 9矩阵。

当您使用一维参数对矩阵进行子集化时,您只需按列主要顺序获取矩阵的元素:

> (mat <- matrix(letters[1:20], ncol = 5)) # example matrix
    [,1] [,2] [,3] [,4] [,5]
[1,] "a"  "e"  "i"  "m"  "q" 
[2,] "b"  "f"  "j"  "n"  "r" 
[3,] "c"  "g"  "k"  "o"  "s" 
[4,] "d"  "h"  "l"  "p"  "t" 

> mat[1:6] # returns vector of length six
[1] "a" "b" "c" "d" "e" "f"

> mat[2:3, ] # returns 2 x 6 matrix
    [,1] [,2] [,3] [,4] [,5]
[1,] "b"  "f"  "j"  "n"  "r" 
[2,] "c"  "g"  "k"  "o"  "s"