【问题标题】:Is there a native R syntax to extract rows of an array?是否有本地 R 语法来提取数组的行?
【发布时间】:2021-02-12 08:34:33
【问题描述】:

想象一下,我在 R 中有一个 N 维数组(矩阵将是一个二维数组),我想从数组的 1 到 n 中选择行。我想知道在不知道维数的情况下是否有在 R 中执行此操作的语法。 确实可以的

x = matrix(0, nrow = 10, ncol = 2)
x[1:5, ] # to take the 5 first rows of a matrix

x = array(0, dim = c(10, 2, 3))
x[1:5, , ] # to take the 5 first rows of a 3D array

到目前为止,我还没有找到一种方法来使用这种写作方式来提取数组的行而不知道它的维数(显然,如果我知道维数,我只需要根据需要放置尽可能多的逗号)。以下 sn-p 有效,但似乎不是最原生的方式:

x = array(0, dim = c(10, 2, 3, 4)
apply(x, 2:length(dim(x)), function(y) y[1:5])

有没有更多的 R 方法来实现这一点?

【问题讨论】:

  • R 注释字符是# 而不是//。我已经用这个更正编辑了这个问题。

标签: r multidimensional-array subset tensor


【解决方案1】:

实际上,您的应用解决方案是最好的。

apply(x, 2:length(dim(x)), `[`, 1:5)

甚至像@RuiBarradas 指出的那样更好(也请投票给他的评论!):

apply(x, -1, `[`, 1:5)

来自 Lisp,我可以说,R 非常 lispy。 apply 解决方案是一个非常简单的解决方案。 因此它非常 R-ish(遵循函数式编程范式的解决方案)。

【讨论】:

  • 删除目标MARGIN:apply(x, MARGIN = -1, '[', 1:5)更简单,并且可以更通用。 +1。
  • 不客气,@GFabien!问题实际上是,x[1:5, , ] 中的空值,在 R 中总是可以写为`x`(1:5, , ),实际上是:`x`(1:5, 1:dim(x)[2], 1:dim(x)[3])。通常构建参数列表的其余部分在代码中总是比apply 解决方案更复杂。
  • @RuiBarradas 这很优雅!我会在有能力的时候支持你的评论。只是为了记录,我在这里添加,如果我们将其应用于另一个维度,它将置换数组的维度,因此必须小心。
  • @GFabien 我不明白您所说的置换是什么意思,以下 3 号昏暗的作品按预期工作:apply(x, MARGIN = -3, '[', 1:2)。我看到的问题是第二个暗淡,参数drop 不能按(我)预期的那样工作:apply(x, MARGIN = -2, '[', 1, drop = FALSE)
  • 我认为该操作是一种对原始数组进行子集化的方法,方法是在给定模式下仅选择几个元素而其他元素保持不变(例如,取前五行是选择第一种模式)。因此,我希望 apply(x, MARGIN = -3, '[', 1:2) 返回 x 但第三维现在长度为 2,即 x[, , 1:2] 用于 3D 数组。确实它有效,但模式被置换了。为了达到我的预期,您可以执行aperm(apply(x, -3, "[", 1:2), c(2, 3, 1)) 之类的操作来匹配x[, , 1:2]。 (它也适用于第二个暗淡。)
【解决方案2】:

函数slice.index() 很容易被忽略(据我所知,请参阅magic::arow()),但在这种情况下可能很有用:

x <- array(runif(60), dim = c(10, 2, 3))
array(x[slice.index(x,1) %in% 1:5],c(5,dim(x)[-1]))

HTH,罗宾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2022-09-24
    • 2020-02-14
    • 2012-10-22
    • 2019-09-21
    • 1970-01-01
    • 2011-03-12
    • 2019-08-21
    相关资源
    最近更新 更多