2017-05-25 43 views
-1

我有一个包含各种变量的数据帧。函数内的引用向量

'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”的输出。一切工作正常,如果我直接键入名称,为每个变量我想要分析一个行条目,但我怎样才能引用向量中的外观,以便该函数可以识别数字数据而不是字符?

+0

您可能需要'assign'和'get' – akrun

+0

'paste0()'给出一个字符作为结果。请阅读该功能的精美手册,部分**值**。 – jogo

回答

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

+0

感谢您的回复。 Aurele的简单方法在一组测试变量上运行良好,然后该函数在另外一些测试中崩溃。所以,我不能像我想象的那样自动化。再次感谢这两个回复。 – fibrou