从R中的for循环内输出对象,每个步骤中的名称都会更改

时间:2013-08-19 14:17:45

标签: r loops for-loop

我正在尝试根据每个步骤更改的条件创建一个输出特定sql查询的for循环。此外,我正在尝试根据创建它们的步骤指定输出名称。例如,步骤1将输出一个名为species1的表。我试图写的代码如下。我确信答案很简单,但对于我的生活,我无法找出正确的方法来表达这一点。在此先感谢您的所有帮助

for (i in 1:15) {
Species[i]<-sqldf("SELECT StartYear, StartMonthNo, RegionCode, CommonName, EstimatedBiomassg, ScaledProportionofDominantNektonBiomass
                FROM TrawlBiomassbyMonth
                WHERE CommonName = TopSpecies[i,1]
                AND RegionCode=1")

Species[i]TimeSeries<-sqldf("SELECT TimeSeries.StartYear, TimeSeries.StartMonthNo, CommonName, EstimatedBiomassg, ScaledProportionofDominantNektonBiomass
                FROM TimeSeries
                LEFT JOIN Species[i]
                ON TimeSeries.StartYear = Species1.StartYear 
                AND TimeSeries.StartMonthNo = Species1.StartMonthNo")
Species[i]TimeSeries[is.na(Species[i]TimeSeries)] <- 0}

修改

这是一个简化的例子:

for (i in 1:2) {
  Species[i]<-sqldf("SELECT StartYear, StartMonthNo, CommonName, Biomass
                    FROM ExampleBiomass
                    WHERE CommonName = ExampleTopSpecies[i,1])}

生物量的投入

structure(list(StartYear = c(1985L, 1985L, 1985L, 1985L, 1985L, 
1985L, 1985L, 1985L, 1985L, 1985L, 1985L, 1985L, 1986L, 1986L, 
1986L, 1986L, 1986L, 1986L, 1986L, 1986L, 1986L, 1986L, 1986L, 
1986L), StartMonthNo = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
12L), CommonName = structure(c(1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L
), .Label = c("Ninja", "Pirate"), class = "factor"), Biomass = c(26L, 
107L, 126L, 35L, 84L, 147L, 98L, 141L, 112L, 43L, 28L, 79L, 36L, 
126L, 31L, 89L, 133L, 34L, 38L, 117L, 92L, 81L, 93L, 127L)), .Names = c("StartYear", 
"StartMonthNo", "CommonName", "Biomass"), class = "data.frame", row.names = c(NA, 
-24L))

TopSpecies的输入

structure(list(CommonName = structure(1:2, .Label = c("Ninja", 
"Pirate"), class = "factor"), Biomass = c(500L, 450L)), .Names = c("CommonName", 
"Biomass"), class = "data.frame", row.names = c(NA, -2L))

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

basic_query <- "SELECT StartYear, StartMonthNo, CommonName, Biomass FROM ExampleBiomass WHERE CommonName = "

Species <- list()

for (i in 1:2) {
  Species[[i]] <- sqldf(paste(basic_query, as.character(ExampleTopSpecies[i,1])))
}

一些解释:

  • basic_query保存SQL查询的commom部分。
  • Species <- list()创建一个空的列表对象,将由您的循环填充。
  • Species[[i]] <-添加了一个列表Species的元素。
  • paste简单地连接字符串。
  • as.character(ExampleTopSpecies[i,1])是必需的,因为您的数据框包含因素。