使用字符向量循环许多函数

时间:2015-03-11 17:25:49

标签: r

我认为这比现在容易,但我正在学习用R编码,所以循环肯定不是我的强项。

我在这里尝试做的是采取一系列具有MISO共同主题的功能。正如你在第一批代码中看到的那样,MISO是常见的,但是我想像在for循环中那样交换MISO for i然后在字符向量中循环几个不同的名称。让我们调用该字符向量ID,以便ID <- c("MISO","PJM","SERC") 在代码中的这一点上,all_Cities_MISO已经是我环境中的数据框架。我只想打破它并进行一些计算。

meanAvgHighMISO <- mean(all_Cities_MISO$Col21)
 meanAvgLowMISO <- mean(all_Cities_MISO$Col20)
 meanAvgMISO <- mean(cbind(meanAvgHighMISO,meanAvgLowMISO))

 names(meanAvgMISO) <- ifelse(meanAvgMISO<65,"HDD","CDD")
 MISO_Avg_DD <- ifelse(meanAvgMISO<65,(65-meanAvgMISO),(meanAvgMISO-65)) #average degree days for each period


 MISO_op_mean <- apply(all_Cities_MISO[,1:19],2, mean)

所以我尝试了几次不同的时间,但不断收到Error: unexpected string constant in: " meanAvgHigh"i""

等错误

我觉得在上面的代码中用一个简单的for循环用PJM替换MISO应该很简单,但没有运气。它必须与它不喜欢MISO作为一个角色。

这是我对for循环的尝试:

ID <- c("MISO","PJM","SERC")

for(i in ID){

  meanAvgHigh"i" <- mean(all_Cities_"i"$Col21)
  meanAvgLow"i" <- mean(all_Cities_"i"$Col20)
  meanAvg"i" <- mean(cbind(meanAvgHigh"i",meanAvgLow"i"))

  names(meanAvg"i") <- ifelse(meanAvg"i"<65,"HDD","CDD")
  "i"_Avg_DD <- ifelse(meanAvg"i"<65,(65-meanAvg"i"),(meanAvg"i"-65)) #average degree days for each period

  "i"_op_mean <- apply(all_Cities_"i"[,1:19],2, mean)
}

我尝试使用[i]而不是“i”,但这也不起作用。我知道MISO本身在我显示的第一个代码中不是一个字符,但我不确定R如何在循环中识别它...否则我只想在循环中进行简单的名称交换。 PJM或SERC等的MISO

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

虽然可以使用environment()assign()方法执行此操作,但我会建议不要这样做。您应该使用嵌套列表来保存这些值。

但是,为了完整性,这就是我认为会这样做的方式(未经测试):

env <- environment()

ID <- c("MISO","PJM","SERC")
for(i in ID){

  assign(paste0("meanAvgHigh", i), mean(env[[ paste0("all_Cities_", i) ]]$Col21))
  assign(paste0("meanAvgLow", i), mean(env[[ paste0("all_Cities_", i) ]]$Col20))
  assign(paste0("meanAvg", i), mean(cbind(env[[ paste0("meanAvgHigh", i) ]], env[[ paste0("meanAvgLow", i) ]])))

  names(env[[ paste0("meanAvg", i) ]]) <- ifelse(env[[ paste0("meanAvg", i) ]] < 65,"HDD","CDD")

  ##### Note: The ifelse can probably be replaced by an abs
  assign(paste0(i, "_Avg_DD"), ifelse( env[[ paste0("meanAvg", i) < 65,
                                       (65 - env[[ paste0("meanAvg", i) ]]),
                                       (env[[ paste0("meanAvg", i) ]] - 65) 
                                     )) #average degree days for each period

  assign(paste0(i, "_op_mean"), apply(env[[ paste0("all_Cities_", i) ]][,1:19], 2, mean)
}

基本想法是使用assign 设置当前环境中的值,然后使用当前环境env 获取来通过索引。