2017-05-25 17 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で動作させることができます。

それは次のようになります。実際には、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(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

関連する問題