2016-08-22 10 views
0

まずは専門家のコーダーではないと言いましょう。この特定の質問や一般的なテクニックに関するアドバイスをいただければ幸いです。ペースト機能を使用して変数値を計算するR

私は、Table6.1という表題のようなデータフレームで構成された大きなデータセットを持っています。私は、ST1_Delta_PV%、ST2_Delta_PV%、ectのように繰り返される各データフレーム内の変数を持っています。およびST1_Realloc_Margin、ST2_Reallocation_Marginなどがあります。

私は、これらの類似した変数にまたがって各テーブルの値を計算する複数のネストループを作成しようとしています。私は以下のようにペースト機能を使ってこれを実行しようとしましたが、これは明らかにこれを行う正しい方法ではありません。

for (i in 1:25){ 
for (j in 1:4){ 
    for (k in 1:length(paste("Table6.",i,"sep="")[,1]){ 
    paste("Table6.",i,sep="")$paste("ST",j,"NonTgt_Shr",sep="")[k] <- paste("Table6.",i,sep="")$paste("ST",j,"_Delta_PV%",sep="")[k] * paste("Table6.",i,sep="")$paste("ST",j,"_Reallocation_Margin",sep="")[k] 
    } 
} 
} 

これは完全に混乱している場合はお詫び申し上げます。私はあなたの助けに感謝します。

+2

場所のデータセットを、計算を行います。あなたのコードから、あなたが何をするのかははっきりしていません。とにかく、 '貼り付け 'の方法は行く方法ではありません(特に割り当て) – akrun

+0

[データフレームのリストを作成/使用する方法はこちら](http://stackoverflow.com/a/24376207/903061)。 – Gregor

答えて

1

akrun saysとして、あなたはリスト

Tables <- list(Table6.1, Table6.2, …) 

for (Table in Tables) { … } 

この方法であなたのデータフレームを置く必要があり、あなたは別のテーブル名を構築するためにpasteを使用する必要はありません。

異なる列にアクセスするために、あなたはdf["column"]構文を使用することができます - これはカッコ内ことを除いて、df$columnに似ている、あなたは私が名前を格納するための変数を使用する方法を任意の文字列

nonTgt_Shr.column.name <- paste0("ST",j,"NonTgt_Shr") 
delta.column.name <- paste0("ST",j,"_Delta_PV%") 
for (k in 1:nrow(Table) { 
    Table[nonTgt_Shr.column.name][k] <- Table[delta.column.name][k] * … 
} 

注意を使用することができます実際の計算による線をはるかに読みやすくします。 nrowlength(Table[,1])よりも直感的です。計算は実際の計算関数のスケーリング、可読性を向上させる機能を形質転換し、 堅牢

ことができる

+2

@akrunはそう言っているだけでなく、最近ほとんど毎日、この広告嫌がらせを繰り返しています。 – Roland

+0

ありがとうございました。これは大きく役立ちます。 –

1

、機能getは名前に基づいてデータフレームを取得するために使用されます。

#Calculation Function 

fn_CalcVariables <- function(
    tableName="Table6.1", 
    outputVarName="NonTgt_Shr", 
    inputVarNames=c("_Delta_PV%", "_Reallocation_Margin"), 
    variablePrefix="ST1" 
) { 
    DF <- get(tableName) 

    outputVarName <- paste0(variablePrefix, outputVarName) 
    inputVarNames <- paste0(variablePrefix, inputVarNames) 

    DF[,outputVarName] <- DF[,inputVarNames[1]] * DF[,inputVarNames[2]] 

    return(DF) 

} 

この関数は、ネストされたlapply呼び出しによって呼び出す必要があります。 lapplyは、引数のリストを反復処理し、関数(第2引数)を呼び出し、戻り値のリストを収集します。 (練習として、l <- list(a=1, b=2); lapply(l, function(x) { x*2 })を試してみてください。)リストを `list`、ループ内

#List object names for tables and variable names 

tableNamesList <- paste0("Table6.",1:25) 
variablePrefixList <- paste0("ST",1:4) 

#Nested loops to invoke custom function from above 
lapply(variablePrefixList, function(alpha) { 

    lapply(tableNamesList, function(x, varprefix=alpha) { 

     cat("Begin Processing Table",x,"varPrefix",varprefix,"\n") 

     fn_CalcVariables(
      tableName=x, 
      outputVarName="NonTgt_Shr", 
      inputVarNames=c("_Delta_PV%","_Reallocation_Margin"), 
      variablePrefix=varprefix 
     ) 
     cat("End Processing Table", x, "varPrefix", varprefix, "\n") 

    }) #End of innner lapply 

}) #End of outer lapply 
+0

私は関数の作成を使うことの価値を確かに知ることができます。これは私が以前使用していなかったいくつかの操作を使用します。私はこれらについていくつかの読書をしなければならないでしょう。どうもありがとうございました。 –

+0

私はインデントといくつかの説明を追加しました。あなたにとって大丈夫です。 –

+0

編集のおかげで、ユーザーはループから* plyファミリー – OdeToMyFiddle

関連する問題