【问题标题】:Assigning names to a vector on instantiation在实例化时为向量分配名称
【发布时间】:2013-11-02 01:44:53
【问题描述】:

对于 R 中的大多数基本数据结构,可以同时分配值和名称。例如:

l <- list(a=1:3, b=4)
m <- matrix(1:9, 3, 3, dimnames=list(letters[1:3], letters[1:3]))
d <- data.frame(a=1:5, b=letters[1:5], c=rnorm(5))

但是对于向量,这是不同的。据我所知,将names 提供给向量的唯一方法是事后:

v <- 1:3
names(v) <- letters[1:3]

c 没有允许您在实例化时指定 names 的参数。
尝试在分配时执行此操作(例如在 listsdata.frames 中)也不起作用:

v <- c("a"=1)  # error

是否可以同时分配数据和向量的名称?

【问题讨论】:

  • 但是您没有像创建列表和数据框时那样尝试:v &lt;- c(a=1)v &lt;- setNames(1,"a")
  • 运行c("a"=1)时遇到什么错误?
  • 原来我试过c(letters[1:3]=1:3) 并给出了错误,但c("a"=1) 有效(以及c("a"=1, "b"=2, ...) 的扩展。但@JoshuaUlrich 的答案更方便
  • @Manetheran,你为什么不直接写一个答案并接受它以表明这个问题有答案。
  • 会的!由于投反对票,我把它写成一个愚蠢的问题。

标签: r vector


【解决方案1】:

正如 Joshua Ulrich 在 cmets 中回答的那样,正确答案是使用 setNames

v <- setNames(1:2, letters[1:2])

我原来的问题也不正确:v &lt;- c("a"=1) 有效,但是扩展它非常乏味:v &lt;- c("a"=1, "b"=2, ...)

【讨论】:

    【解决方案2】:

    另一个(丑陋的)解决方案是使用structure()

    v <- structure(1:3, .Names = c("a", "b", "c"))
    

    (我是通过查看dput(v) 之后的结果来到这里的 让它变得艰难。)

    【讨论】:

      【解决方案3】:

      我不确定我是否理解正确,但也许这就是你要找的:

      for (n in 1:6) assign(x=letters[n], value=n)
      

      产生:

      > a
      [1] 1
      > b
      [1] 2
      > c
      [1] 3
      > d
      [1] 4
      > e
      [1] 5
      > f
      [1] 6
      

      【讨论】:

      • 这不是他想要的。他想创建一个命名向量。
      • 好的。那么答案是@JoshuaUlrich 的:sapply(c(1:6), setNames(x, letters[x]))
      • 不,答案是setNames(1:6, letters[1:6])
      • 对不起,我的意思是:sapply(c(1:6), function(x){setNames(x, letters[x])})
      • 这仍然返回六个向量,而不是一个包含六个元素的向量。
      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多