【问题标题】:R: Get a matrix row without using 2d index syntaxR:在不使用二维索引语法的情况下获取矩阵行
【发布时间】:2015-06-26 11:06:39
【问题描述】:

我有一个如下所示的矩阵:

> 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 矩阵.一个聪明的 hack,如果你喜欢的话。

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

【问题讨论】:

    标签: r matrix indexing


    【解决方案1】:

    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" 
    

    【讨论】:

    • 那么您知道转换为返回具有单个索引的整行的数据结构吗?我知道一个列表会起作用,但我似乎不知道如何转换它。
    • 要将矩阵的行转换为列表,请尝试split(&lt;yourMatrix&gt;, row(&lt;yourMatrix&gt;))
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多