【问题标题】:Subsetting R array: dimension lost when its length is 1子集R数组:长度为1时丢失维度
【发布时间】:2012-10-05 23:42:46
【问题描述】:

当对数组进行子集化时,R 的行为会有所不同,具体取决于其中一个维度的长度是否为 1。如果一个维度的长度为 1,则该维度在子集期间丢失:

ax <- array(1:24, c(2,3,4))
ay <- array(1:12, c(1,3,4))
dim(ax)
#[1] 2 3 4
dim(ay)
#[1] 1 3 4
dim(ax[,1:2,])
#[1] 2 2 4
dim(ay[,1:2,])
#[1] 2 4

在我看来,ax 和 ay 是相同的,对它们执行相同的子集操作应该返回一个具有相同维度的数组。我可以看到 R 处理这两种情况的方式可能很有用,但在我正在编写的代码中是不可取的。这意味着当我将一个子集数组传递给另一个函数时,如果我在早期阶段碰巧将一个维度减少到长度 1,该函数将获得一个缺少维度的数组。 (所以在这种情况下,R 的灵活性使我的代码不太灵活!)

如何防止 R 在子集期间丢失长度为 1 的维度?还有其他索引方式吗?要设置一些标志吗?

【问题讨论】:

标签: r subset


【解决方案1】:

正如您所发现的,默认情况下 R 会删除不必要的尺寸。在索引时添加drop=FALSE 可以防止这种情况:

> dim(ay[,1:2,])
[1] 2 4
> dim(ax[,1:2,])
[1] 2 2 4
> dim(ay[,1:2,,drop = F])
[1] 1 2 4

【讨论】:

  • 谢谢你,达森。完美的。我没想到你可以那样做。 (我知道这是一个常见问题解答,但很难为答案构建一个有用的搜索字符串。)
  • 后续问题:如何从内置帮助系统中获取这些语法信息?
  • R 在其默认行为中有一个讨厌的副作用习惯 :(
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2015-05-16
  • 2021-06-18
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多