【问题标题】:Names combined by dot automatically when assign value of a named array with a named variable使用命名变量分配命名数组的值时,名称自动由点组合
【发布时间】:2017-11-27 13:45:59
【问题描述】:

一个简单的例子:

a <- quantile(1:10, 0.1)
a

输出:

10%
1.9

使用 a 为命名数组赋值:

b = c(index=0, value=a)
b

输出:

index value.10%
 0.0     1.9

为什么 'value' 和 '10%' 会自动用点组合? 如何避免这种情况,因为我只想将其命名为“价值”?

【问题讨论】:

  • 您可以使用unname:c(index=0, value=unname(a))as.vector:c(index=0, value=as.vector(a))。来自帮助文件?cc 有时用于删除除名称之外的属性的副作用,例如将数组转换为向量。 as.vector 是一种更直观的方法,但也会删除名称。
  • c(index=0, setNames(a,"value"))setNames(c(0,a),c("index","value"))
  • @Imo,这解决了我的问题。谢谢!
  • 在这种特定情况下,您还可以使用names=FALSE 参数调用quantile,因为您想覆盖它们:a &lt;- quantile(1:10, 0.1,names=FALSE)。这样您还可以获得效率奖励。

标签: r named


【解决方案1】:

问题中创建的b 对象是一个 R 命名向量,而不是一个 R 数组。

数组

R 数组是一个 R 向量,具有一个(或多个)维度,可能还有一个 dimnames 属性。它是这样创建的:

ar <- array(c(0, a), dimnames = list(c("index", "value"))); ar
## index value 
##   0.0   1.9 

命名向量

要创建具有指定名称的命名向量而不是创建数组,请使用 setNames 覆盖任何现有名称:

v <- setNames(c(0, a), c("index", "value")); v
## index value 
##   0.0   1.9 

或像这样使用names&lt;-

v <- c(0, a)
names(v) <- c("index", "value")

或者如 cmets 中所述,从 unname(a) 而不是从 a 创建 b 以避免组合名称。

属性

注意ar的属性是:

attributes(ar)
## List of 2
##  $ dim     : int 2
##  $ dimnames:List of 1
##   ..$ : chr [1:2] "index" "value"

v的属性是:

attributes(v)
## $names
## [1] "index" "value"

【讨论】:

    【解决方案2】:

    评论中的答案可以帮助您解决这个问题,但我认为您必须了解a 已经是一个命名向量这一事实。所以在这里使用cc for concat)你尝试连接两个不同类型的对象。这就是为什么 R 试图通过连接名称来使其工作,这里是原始名称 (10%) 和您想要提供的名称。

    在这种情况下,写c(c(index=0), a) 然后更改名称或c(index=0, value=unname(a)) 对我来说更有意义

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 2015-03-15
      • 2014-05-21
      • 2016-04-28
      • 2018-09-28
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多