【问题标题】:Assigning to objects using names created from a vector in R使用从 R 中的向量创建的名称分配给对象
【发布时间】:2018-10-18 18:04:12
【问题描述】:

我有两个向量:

years<-c(1995:1999)
values<-c(1:5)

我想创建五个对象,分别命名为“Obj1995”、“Obj1996”等,并按顺序为它们分配values中的值,以便Obj1995==1Obj1996==2等。

我尝试使用assign()

assign(paste0("Obj",years),values)

但这不是向量化的,所以它只创建了一个对象,包含所有values

In assign(paste0("Obj",years),values) :
  only the first element is used as variable name

有没有办法在没有 for 循环的情况下实现我的目标?

【问题讨论】:

  • 仅供参考,通常的建议是:不要那样做。两者都不会创建一堆自然地组合在一个对象中的对象。并且不要在字符串中嵌入数据(在这种情况下是年份)。也就是说,yr_DF = data.frame(yr = years, v = values) 或类似...
  • 谢谢,我知道这个建议,并已将其考虑在内。实际用例并不像示例那么简单,虽然我可以将所有内容都放入一个列表中,但将多维数组作为列表对象变得过于繁琐,无法满足我的需求。
  • library("fortunes"); fortune(236)

标签: r assign


【解决方案1】:

我们可以在named list 上使用list2env

list2env(as.list(setNames(values, paste0("Obj", years))), envir = .GlobalEnv)

Obj1995
#[1] 1
Obj1996
#[1] 2

assign 可以与for 循环一起使用

rm(list = ls(pattern = "^Obj\\d{4}$")) # remove any objects 
for(i in seq_along(values)) assign(paste0("Obj", yearsi]), value = values[i])

【讨论】:

  • 谢谢!是的,我自己想出了 for-loop 选项,但想找出一个矢量化的替代方案。你的回答颠覆了年份和价值观,但我明白了它的要点,并让它发挥作用。我实际上在另一个答案中看到了 list2env,但它没有 satNames 部分,我无法弄清楚这一点。
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2015-09-16
  • 2020-07-21
  • 2016-08-18
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多