基于变量id对不同版本的数据集进行循环,并在每次循环后保存结果

时间:2016-11-14 19:43:02

标签: r loops dataframe

  • 我有一个x年国家的数据集。
  • 我想做一些分析(见下图所示,但这段代码不是问题)
  • 问题:我想对我已经拥有的代码进行多次分析:每次使用不同的数据集,其中包含x个国家和y年的另一个组合。需要说明的是:我希望对x国家和y年的每种可能组合进行分析

我想为每个版本的数据集执行的代码(解释数据集详见)

library(stats)    
##### the analysis for one dataset ####
        d=data.frame(outcome_spring=rep(1,999),outcome_summer=rep(1,999),
                     outcome_autumn=rep(1,999),outcome_winter=rep(1,999))


    o <- lapply(1:999, function(i) { 


      Alldata_Rainfed<-subset(Alldata, rainfed <= i)

      outcome_spring=sum(Alldata$spring)
      outcome_summer=sum(Alldata$summer)
      outcome_autumn=sum(Alldata$autumn)
      outcome_winter=sum(Alldata$winter)


      d[i, ] = c(outcome_spring, outcome_summer, outcome_autumn, outcome_winter)


    } )

    combination<-as.data.frame(do.call(rbind, o)) #the output I want is another dataset for each unique dataset

    #### the end of the analysis for one dataset ####

所需的输出

这意味着作为输出,我需要具有相同数量的数据集(在示例中命名为“组合”),作为x个国家和y年之间可能的组合数量。

例如,假设有以下数据集(真实数据集有超过500000个观测值,15个国家,9年)

> dput(Alldata)
structure(list(country = c("belgium", "belgium", "belgium", "belgium", 
"germany", "germany", "germany", "germany"), year = c(2004, 2005, 
2005, 2013, 2005, 2009, 2013, 2013), spring = c(23, 24, 45, 23, 
1, 34, 5, 23), summer = c(25, 43, 654, 565, 23, 1, 23, 435), 
    autumn = c(23, 12, 4, 12, 24, 64, 23, 12), winter = c(34, 
    45, 64, 13, 346, 74, 54, 45), irrigation = c(10, 30, 40, 
    300, 288, 500, 996, 235), id = c(1, 2, 2, 3, 4, 5, 6, 6)), datalabel = "", time.stamp = "14 Nov 2016 20:09", .Names = c("country", 
"year", "spring", "summer", "autumn", "winter", "irrigation", 
"id"), formats = c("%9s", "%9.0g", "%9.0g", "%9.0g", "%9.0g", 
"%9.0g", "%9.0g", "%9.0g"), types = c(7L, 254L, 254L, 254L, 254L, 
254L, 254L, 254L), val.labels = c("", "", "", "", "", "", "", 
""), var.labels = c("", "", "", "", "", "", "", "group(country year)"
), row.names = c("1", "2", "3", "4", "5", "6", "7", "8"), version = 12L, class = "data.frame")

在上面的例子中,我已经为国家和年份组合了一个 id 。这意味着我想制作包含以下ID组合的所有观测数据集:

  • 数据集1_2_3_4_5:ID 1,2,3,4,5(因此此数据集仅错过id = 6的观察结果)
  • 数据集1_2_3_4_6:ID 1,2,3,4,6(但不是5)
  • 数据集1_2:ID 1,2(但不是所有其余的)
  • 数据集3_4_5:ID 3,4,5(但不是所有其余的)
  • ....

等等...请注意,我给数据集的名称指定了包含的ID的名称。否则,我很难区分所有不同的数据集。其他名称也可以,只要我可以区分数据集!

感谢您的帮助!

编辑:某些数据集可能没有给出结果(因为在第二次循环中灌溉也使用了循环而某些组合可能没有灌溉)但是输出应该只是一个缺少值的数据集

1 个答案:

答案 0 :(得分:1)

不确定这是否是最有效的方法,但我认为它应该有效:

# create a df to store the results of all combinations
result=data.frame()

下一个循环基于combn()函数,该函数使用m个元素创建向量(此处为ID)的所有可能组合。

for(i in 2:max(o$id)){
  combis=combn(unique(o$id),i)
  for(j in 1:ncol(combis)){
    sub=o[o$id %in% combis[,j],]
    out=sub[1,]    # use your function
    out$label=paste(combis[,j],collapse ='') #provide an id so you know for which combination this result is
    result=rbind(result,out) # paste it to previous output
  }
}