函数内的参考向量

时间:2017-05-25 11:17:44

标签: r

我有一个包含各种变量的数据框。

'data.frame':   324 obs. of  13 variables:
 $ caldt     : Date, format: "1990-01-31" "1990-02-28" "1990-03-30" 
 $ X30bd     : num  -0.0429 -0.00595 -0.00265 -0.03033 0.04894 ...
 $ X20bd     : num  -0.0396 -0.00269 -0.00227 -0.02729 0.04885 ...
 $ X10bd     : num  -0.02441 -0.00207 -0.0017 -0.0174 0.03283 ...

...

我创建了一个包含我想要进行分析的感兴趣变量的向量。

endowmentAssetClasses <- c("X30bd", "X20bd")

我想为每个要执行分析的变量创建一个不同的R对象。

for (i in endowmentAssetClasses) {
     paste0(i,".gpd.fit") <- gpd.tail(paste0("endowMVEVdata$",i),upper=quantile(paste0("endowMVEVdata$",i),0.9), 
                     lower=quantile(paste0("endowMVEVdata$",i),0.1))
}

我收到了一个错误,

non-numeric argument to binary operator

意思是我引用了向量“endowMVEVdata $ X30bd”等等作为字符,但我无法创建gpd对象

x30bd.gpd.fit

x20gd.gpd.fit 

在“循环”中包含函数“gpd.tail”的输出。如果我直接输入名称,并且每个变量的行条目都需要分析,一切正常,但是如何在一个外观中引用矢量以便函数识别数字数据而不是字符?

1 个答案:

答案 0 :(得分:1)

就像@akrun所说的那样,你确实可以使用assignget

看起来像是:

for (i in endowmentAssetClasses) {
  assign(
    paste0(i, ".gpd.fit"),
    gpd.tail(
      endowMVEVdata[[i]], 
      upper = quantile(endowMVEVdata[[i]], 0.9), 
      lower = quantile(endowMVEVdata[[i]], 0.1)
    )
  )
}

实际上,此处不需要getget(paste0("endowMVEVdata$", i))不起作用。 eval(parse(text = paste0("endowMVEVdata$", i)))会,但实际上不会。

可是:

fortunes::fortune(236)
# The only people who should use the assign function are those who fully
# understand why you should never use the assign function.
# -- Greg Snow
# R-help (July 2009)

R方式不是在工作空间和循环中使用多个变量,而是在列表中存储类似的东西并将它们传递给函数。直接翻译将是:

gpd.fit.list <- lapply(
  setNames(nm = endowmentAssetClasses),
  function(x) gpd.tail(
    endowMVEVdata[[x]], 
    upper = quantile(endowMVEVdata[[x]], 0.9), 
    lower = quantile(endowMVEVdata[[x]], 0.1)
  ) 
)

或更简单:

gpd.fit.list <- lapply(
  endowMVEVdata[, endowmentAssetClasses, drop = FALSE],
  function(y) gpd.tail(y, upper = quantile(y, 0.9), lower = quantile(y, 0.1))
)

请注意,此代码未经过测试,因此如果没有一些调整,它可能无法正常工作。您应该提供minimal reproducible example