首先让我说我不是专家编码员,对此特定问题或我的一般技巧的任何建议将不胜感激。
我有一个大型数据集,它由名为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]
}
}
}
如果这是一个完整的混乱,我道歉。感谢您的帮助。
答案 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] * …
}
注意我如何使用变量来存储名称,使得实际计算的行更具可读性。
此外,nrow
比length(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