2016-08-22 2 views
0

Прежде всего позвольте мне сказать, что я не эксперт-кодер, и любые советы по этому конкретному вопросу или моя общая техника будут высоко оценены.Вычисление значений переменных с использованием функции вставки в R

У меня есть большой набор данных, состоящий из аналогичных фреймов данных с именем Table6. #, Таких как: Table6.1, Table6.2, ect. У меня есть переменные в каждом кадре данных, которые также повторяются, например: ST1_Delta_PV%, ST2_Delta_PV%, ect. и ST1_Realloc_Margin, ST2_Reallocation_Margin, ect.

Я пытаюсь написать несколько вложенных циклов, которые будут вычислять значения в каждой таблице по этим подобным переменным. Я попытался сделать это с помощью функции вставки, как показано ниже, но это, очевидно, не правильный способ сделать это.

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] * … 
} 

Обратите внимание, как я использую переменные для хранения имени , что делает линию с фактическим вычислением более читаемой. Также, nrow более интуитивно понятный, чем length(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