使用R

时间:2016-08-22 15:51:35

标签: r paste assign

首先让我说我不是专家编码员,对此特定问题或我的一般技巧的任何建议将不胜感激。

我有一个大型数据集,它由名为Table6的类似数据帧组成。#例如:表6.1,表6.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 个答案:

答案 0 :(得分: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])更直观。

答案 1 :(得分: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