循环变量名称时提取系数

时间:2017-08-20 20:02:49

标签: r

我正在研究R(版本3.4.1)中的一些时间序列的东西,并且想从我运行的回归中提取系数,以便进行进一步的分析。

到目前为止,所有结果都保存为uGARCHfit对象,这些对象基本上是复杂的列表对象,我想从中以下列方式提取系数。

我想要的只是这个:

for(i in list){
    i_GARCH_mxreg <- i_GARCH@fit$robust.matcoef[5,1]
}

“list”是一个列表对象,其中每个元素都是一个观察的名称。现在,我希望我的循环创建一个名为我在循环中指定的新数字对象。

现在这显然不起作用,因为索引“i”没有像我希望的那样被替换。

如何正确地重写我的循环?

最小的工作示例:

list <- as.list(c("one", "two", "three"))
one_a <- 1
two_a <- 2
three_a <- 3
for (i in list){
   i_b <- i_a
}

这应该给我的是:

> one_b
[1] 1
> two_b
[1] 2
> three_b
[1] 3

澄清: 我想从多个列表对象中提取系数。这些以'string'_obj的方式命名。问题是我没有提取这些系数的函数,列表“不是子集”,所以我必须通过obj@fit$robust.matcoef[5,1]调用单个对象(或者有另一种方法吗?)。我想使用循环来获取我的字符串列表,并在每次迭代中,取一个字符串,添加'string'_obj@fit$robust.matcoef[5,1],并将此值保存到一个对象中,再次命名为“'string'_name”

将此列入列表而不是单个对象可能更容易,因为有人建议使用lapply,但这不是我现在主要关注的问题。

可能有一种简单的方法可以做到这一点,但我无法找到它。对不起任何困惑,感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

以下内容应符合您所需的输出:

# your list
l <- as.list(c("one", "two", "three"))
one_a <- 1
two_a <- 2
three_a <- 3

# my workspace: note that there is no one_b, two_b, three_b
ls()
[1] "l"       "one_a"   "three_a" "two_a"  

for (i in l){
   # first, let's define the names as characters, using paste:
   dest <- paste0(i, "_b")
   orig <- paste0(i, "_a")
   # then let's assign the values. Since we are working with 
   # characters, the functions assign and get come in handy:
   assign(dest, get(orig) )
 }

# now let's check my workspace again. Note one_b, two_b, three_b
ls()
 [1] "dest"    "i"       "l"       "one_a"   "one_b"   "orig"    "three_a"
 [8] "three_b" "two_a"   "two_b"  

# let's check that the values are correct:
one_b
[1] 1
two_b
[1] 2
three_b
[1] 3

对所使用的函数发表评论:assign将一个字符作为第一个参数,它应该是新创建的对象的名称。第二个参数是该对象的值。 get接受一个字符,并在工作区中查找与该字符同名的对象值。例如,get("one_a")将产生1.

另外,只是为了跟进我之前的评论:如果我们已经在列表中包含了所有系数,我们可以执行以下操作:

# hypothetical coefficients stored in list:
lcoefs <- list(1,2,3)
# let's name the coefficients:
lcoefs <- setNames(lcoefs, paste0(c("one", "two", "three"), "_c"))

# push them into the global environment:    
list2env(lcoefs, env = .GlobalEnv)

# look at environment:    
ls()
 [1] "dest"    "i"       "l"       "lcoefs"  "one_a"   "one_b"   "one_c"  
 [8] "orig"    "three_a" "three_b" "three_c" "two_a"   "two_b"   "two_c"  

one_c
[1] 1
two_c
[1] 2
three_c
[1] 3

为了解决这些评论,这里有一个更为现实的例子,考虑到list - 结构:

l <- as.list(c("one", "two", "three"))

# let's "hide" the values in a list:
one_a <- list(val = 1)
two_a <- list(val = 2)
three_a <- list(val = 3)

for (i in l){
  dest <- paste0(i, "_b")
  orig <- paste0(i, "_a")
  # let's get the list-object:
  tmp <- get(orig)
  # extract value:
  val <- tmp$val
  assign(dest, val )
}

one_b
[1] 1
two_b
[1] 2
three_b
[1] 3