2016-11-14 74 views
0
  • 我有一个包含y年以上x个国家/地区的数据集。
  • 我想做一定的分析(见下面指出,但是这段代码不是问题)
  • 问题:我想对我已经有的代码做了这样的分析:与另一个x国家和y年的其他数据集合在一起。要清楚:我想做分析为每个可能的x国家组合和y年

,我想,以执行用于数据集的每个版本(说明数据集参见下文)这意味着,作为输出我需要有该代码根据变量id做不同版本的数据集循环,并在每个循环后保存结果

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年之间可能的组合数量。

作为一个例子,假设有以下数据集(实际数据集有达50的意见,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:IDS 1,2,3,4,5(所以此数据集只错过使用id = 6的观察)
  • 数据集1_2_3_4_6:IDS 1,2,3,4,6(但不包括5)
  • 数据集1_2:IDS 1,2(但不是所有的其余部分)
  • 数据集3_4_5:IDS 3,4,5 (但不是全部)
  • ....

等etc ...请注意,我给数据集的名称包含的ID的名称。否则,我很难区分所有不同的数据集。其他名字也很好,只要我能区分数据集!

感谢您的帮助!

编辑:有可能是某些数据集给出任何结果(因为在第二循环中的灌溉使用过环和某些组合可能没有灌溉),但随后的输出应该只是缺少值的数据集

回答

1

不知道这是否是这样做的最有效的方式,但我认为它应该工作:

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

下一个循环是基于combn()函数,它创建了一个向量的所有可能的组合(这里ID),使用m个元素。

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 
    } 
} 
+0

非常感谢你!我在开始的时候遇到了一些麻烦,但我想我已经开始明白了。我将在明天在大学服务器上运行它。希望它有效!我会告诉你!无论如何非常感谢! – user33125

+0

嘿@波!您的解决方案完美运作非常感谢你!你帮了我很多!我问了一个非常小的后续问题:http://stackoverflow.com/questions/40636032/combine-observations-based-on-the-variable-id-if-at-least-5-ids-are-combined也许你也知道这个答案吗?如果不是,非常感谢! – user33125

+0

虽然@Wave,但有一件事我无法解释。我得到以下错误“错误在combn(唯一(Alldata $ id),i):n user33125