【问题标题】:subset and replace all nth elements from an array of vectors子集并替换向量数组中的所有第 n 个元素
【发布时间】:2017-09-01 22:23:26
【问题描述】:

我正在尝试生成一个矩阵,其中每个元素都是长度为 2 的向量,然后自动填充向量。到目前为止我所拥有的是:

dat <- matrix(list(vector("numeric",2)),3,3)
dat

##      [,1]      [,2]      [,3]     
## [1,] Numeric,2 Numeric,2 Numeric,2
## [2,] Numeric,2 Numeric,2 Numeric,2
## [3,] Numeric,2 Numeric,2 Numeric,2

我想填充这个空矩阵,使它看起来像这样:

       [[,1]]   [[,2]]   [[,3]]     
[[1,]] [1] 1 1  [1] 1 2  [1] 1 3
[[2,]] [1] 2 1  [1] 2 2  [1] 2 3
[[3,]] [1] 3 1  [1] 3 2  [1] 3 3

我可以使用代码dat[[1,1]] &lt;- c(1,1) 手动子集和替换每个元素,我可以使用代码sapply(dat,"[", 1) 子集dat 的所有第一个向量元素,但是我不能用所需的替换这些向量元素值,例如sapply(dat,"[", 1) &lt;- rep(1:3,3)(返回 could not find function "sapply&lt;-" 错误)。

【问题讨论】:

    标签: r matrix vector


    【解决方案1】:

    我可以建议您改用 3-D 数组吗?

    ary <- array(1:18, dim=c(3,3,2))
    ary
    # , , 1
    #      [,1] [,2] [,3]
    # [1,]    1    4    7
    # [2,]    2    5    8
    # [3,]    3    6    9
    # , , 2
    #      [,1] [,2] [,3]
    # [1,]   10   13   16
    # [2,]   11   14   17
    # [3,]   12   15   18
    

    重新分配单个“对”。注意结尾的逗号,类似于mtcars[1,] 返回第一行的所有列。

    ary[1,1,] <- c(1, 1)
    ary
    # , , 1
    #      [,1] [,2] [,3]
    # [1,]    1    4    7
    # [2,]    2    5    8
    # [3,]    3    6    9
    # , , 2
    #      [,1] [,2] [,3]
    # [1,]    1   13   16
    # [2,]   11   14   17
    # [3,]   12   15   18
    

    替换所有第一个值:

    ary[,,1] <- rep(1:3, 3)
    ary
    # , , 1
    #      [,1] [,2] [,3]
    # [1,]    1    1    1
    # [2,]    2    2    2
    # [3,]    3    3    3
    # , , 2
    #      [,1] [,2] [,3]
    # [1,]    1   13   16
    # [2,]   11   14   17
    # [3,]   12   15   18
    

    为了在配对值的矩阵上应用一些东西,你可以使用apply(ary, 1:2, ...),例如:

    plot(NA, xlim=c(1,3), ylim=c(1,18))
    apply(ary, c(1,2), function(pts) points(pts[1], pts[2]))
    

    当您查看applyMARGIN 参数(此处为c(1,2))时,它是在说“为每一行应用一个函数,数据的列'集'”。查看简单的二维矩阵时,c(1,2) 的边距会在每个单独的值上迭代函数。在 3-D 数组中,它将函数应用于矩阵的每个“管道”。

    apply 调用等价于这个函数调用序列:

    points(1, 1)
    points(2, 11)
    points(3, 12)
    points(1, 13)
    points(2, 14)
    points(3, 15)
    points(1, 16)
    points(2, 17)
    points(3, 18)
    

    (使用plot(ary[,,1], ary[,,2]) 可以轻松完成此示例,但这并不一定能满足您对接受该对作为单个参数的函数的需求。与mapply(points, ary[,,1], ary[,,2]) 类似。)

    如果您的消费函数采用 vector 值,那么也许这会起作用:

    apply(ary, c(1,2), yourfunc)
    

    【讨论】:

    • 谢谢。我想到了这一点,但不幸的是,我想将每个矩阵元素用作需要一对数值参数的函数的输入。应该指定这一点。有什么想法吗?
    • 请提供一个例子,我不清楚。更重要的是,func(ary[1,1,]) 不按照你的建议做吗?
    • 是的,这可能会奏效。如果我尝试使用lapply 应用func,则另一种形式更可取,但也许我可以结合您的想法使用mapply。知道该怎么做吗?
    • blklempay,这能回答你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多