在R中区分向量和矩阵

3
我正在为我的项目制作一个辅助函数,需要将一组数据转换为百分位数。
在某些情况下,我需要对一组条目进行百分位计算,这相当容易。在其他情况下,我需要对矩阵中的条目进行百分位计算。
这两个过程很相似,但又有所不同。我想能够区分输入是向量还是矩阵,以便知道应该使用哪个操作。
我考虑过使用输入的维度。但是,当*vector*使用dim(*vector*) = NULL时,而使用dim(matrix(1:15, 1,15)) = c(1,15),尽管这有争议是否为向量。因此,我无法使用我的第一个想法。
if(length(dim(objects)) == 2){*A MATRIX*}
else{*A VECTOR*}

我觉得可以在条件中添加 min(dim(objects)) > 1 来测试矩阵,但我认为可能有更好的选项。 (现在我在这里......)你有什么想法吗?

这个问题与 is.matrix(matrix(1,1,2)) = TRUE 相同,但它的维度是 c(1,2),因此从技术上讲它仍然是一个向量。 - jameselmore
1
那么也许是:is.vector(x) | min(dim(x)) > 1 - Arun
是的,我认为 is.vector(x) | min(dim(x)) == 1 应该可以。我在想是否有更好的方法,但可能不会有更好的了哈哈。谢谢。 - jameselmore
或者 ncol(x)>1 | nrow(x)>1 也可以完成任务。 - holzben
@mdsumner,我猜我的“技术上是一个向量”的说法源于我的数学训练。哈哈,我首先是一名数学家,其次才是计算机科学家。 - jameselmore
显示剩余2条评论
2个回答

5

看起来你想忽略任何只有一个级别的维度,那么使用drop会很合适:

if(is.null(dim(drop(x)))) {
  # do vector stuff
} else {
  # do matrix/array stuff
}

谢谢!我最终找到了一个解决这个特定问题的方法。但是,我之前不知道那个函数,它是个好东西。 - jameselmore

2

为什么不使用prop.table进行操作呢?您可以获得行或列的比例,如果您想要百分位数,可以乘以100并将其舍入到所需的精度。

> m <- matrix(1:9, 3)
> prop.table(m, 1)
           [,1]      [,2]      [,3]
[1,] 0.08333333 0.3333333 0.5833333
[2,] 0.13333333 0.3333333 0.5333333
[3,] 0.16666667 0.3333333 0.5000000
> prop.table(m,2)
          [,1]      [,2]      [,3]
[1,] 0.1666667 0.2666667 0.2916667
[2,] 0.3333333 0.3333333 0.3333333
[3,] 0.5000000 0.4000000 0.3750000

> round(100*prop.table(m, 1), 2) # rounded row percentages
      [,1]  [,2]  [,3]
[1,]  8.33 33.33 58.33
[2,] 13.33 33.33 53.33
[3,] 16.67 33.33 50.00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接