2016-08-22 50 views
0

首先讓我說我不是專家的編碼器,任何關於這個特定問題或我的一般技術的建議將不勝感激。使用R中的粘貼功能計算變量值

我有一個很大的數據集,它由名爲Table6。#的類似數據框組成,比如:Table6.1,Table6.2等。我在每個數據幀中都有重複的變量,例如:ST1_Delta_PV%,ST2_Delta_PV%等。和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

將數據集在'list',通過列表循環和做計算。從你的代碼中,你並不清楚你在做什麼。無論如何,'paste'方法不是要走的路(特別是任務) – 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遍歷參數列表,調用函數(第二個參數),並收集返回值列表。 (作爲練習,嘗試l <- list(a=1, b=2); lapply(l, function(x) { x*2 })。)

#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