我有一个包含各种变量的数据框。
'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 :(得分:1)
就像@akrun所说的那样,你确实可以使用assign
和get
。
看起来像是:
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)
)
)
}
实际上,此处不需要get
。 get(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。