r - 具体例子说明为什么R中没有为向量定义维度(向量是无量纲的)?

标签 r vector dimension

Here :在 R 中,需要定义向量的维度,

M。 JORGENSEN(新西兰怀卡托大学统计系):
“对于所有向量来说,dim(A)=length(A) 没有意义吗?”

B.D. RIPLEY(英国牛津应用统计系):
“不。一维数组和向量不是同一件事。 存在细微的差异,例如 names() 的含义(请参阅 ?names)。

一维数组和向量有时会以相同的方式打印 会导致困惑,但是您也无法从打印输出中看出 A 类型为 integer 而不是 double
……
我的问题:
(1) 我不仅无法弄清楚 names() 上的细微差别,而且
(2) 我无法给出一个具体的例子来说明“从打印输出中得知 A 具有integer 类型,而不是double 问题”。

任何有助于澄清 JORGENSEN-RIPLEY 讨论(带有 R 中的具体示例)的帮助将不胜感激。

最佳答案

为了解决第一个问题,我们首先创建一个向量和一个一维数组:

(vector <- 1:10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

(arr_1d <- array(1:10, dim = 10))
#>  [1]  1  2  3  4  5  6  7  8  9 10

如果我们给这些对象一些名称,我们就可以看到区别 Ripley 通过查看属性来暗示:

names(vector) <- letters[1:10]
names(arr_1d) <- letters[1:10]

attributes(vector)
#> $names
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
attributes(arr_1d)
#> $dim
#> [1] 10
#> 
#> $dimnames
#> $dimnames[[1]]
#>  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

也就是说,一维数组实际上没有 names 属性, 而是一个 dimnames 属性(这是一个列表,而不是向量), names() 实际访问的第一个元素。

这在 ?names 的“注释”部分中有介绍:

For vectors, the names are one of the attributes with restrictions on the possible values. For pairlists, the names are the tags and converted to and from a character vector.

For a one-dimensional array the names attribute really is dimnames[[1]].

这里我们还看到缺少 dim 向量的属性。 ( A related SO answer 也涵盖了数组和向量之间的差异。)

附加属性及其存储方法意味着 一维数组总是比它们的向量占用更多的内存:

# devtools::install_github("r-lib/lobstr")
lobstr::obj_size(vector)
#> 848 B
lobstr::obj_size(arr_1d)
#> 1,056 B

然而,这就是我能想到的唯一原因 希望向量和一维数组有不同的类型。我认为这确实是乔根森提出的问题 询问,即为什么有一个没有dim的单独的vector类型 完全没有属性;我认为里普利并没有真正解决这个问题。 我很想听听其他理由。

至于第2)点,当您使用创建向量时: 始终是整数:

vector <- 1:10
typeof(vector)
#> [1] "integer"

具有相同值的 double 将打印相同的内容:

double <- as.numeric(vector)
typeof(double)
#> [1] "double"

double
#>  [1]  1  2  3  4  5  6  7  8  9 10

但是整数和 double 不是一回事:

identical(vector, double)
#> [1] FALSE

R 中整数和 double 之间的差异很微妙,主要是 一是整数占用的内存空间更少。

lobstr::obj_size(vector)
#> 88 B
lobstr::obj_size(double)
#> 168 B

参见this answer更全面地了解整数和 double 之间的差异。

reprex package 创建于 2018-07-09 (v0.2.0.9000)。

关于r - 具体例子说明为什么R中没有为向量定义维度(向量是无量纲的)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51245534/

相关文章:

SSAS 2012 使用维度值过滤其他维度表

R:ggplot 在 2x2 阶乘实验中填充一个因子

r - 将 ifelse() 添加到 Map 函数中

c++ - 如果大小等于特定数字,如何找到字符串 vector 的单个索引的大小并打印索引?

matrix - (Unity3D)MultiplyPoint 和 MultiplyPoint3x4 之间的区别

c++ - 如何在 C++ 中专门化 std::vector 的模板模板参数

algorithm - 高维聚类 + 一些基本的东西

javascript - JS中如何获取元素的实际宽度?

r - 遍历列表 R

r - 组合两种 Emacs 主要模式或更改现有模式的简单方法是什么?