R堆叠环路输出

时间:2013-12-16 11:51:15

标签: r

在保存数据帧中循环的输出时遇到一些问题。由于我的脚本太复杂而无法在此问题中进行解释,因此这是我的代码的简化版本:

编辑

df<-data.frame(matrix(NA, nrow = 100, ncol = 9)) #empty dataframe set for 100 max rows
df<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
do.call(rbind, by(DF, DF[c("YEAR","SITE")], FUN = function(x) {

 df<-dataframe filling code

})

所以基本上它是通过VAR1和VAR2对我的DF进行子集化,并为每个子集构建一个新的df。如何构建一个新的数据帧(TOT),将所有“df”放在彼此的顶部?

注意:我不知道每个“df”会有多少行,这就是为什么我最多设置100行,然后立即删除NA行。但DF和df具有相同的列。

感谢您的帮助!

修改

我的观点是对每个YEAR / SITE组合进行子集化,对其应用一个函数(根据每个子集构建一个虚拟数据的df,其格式与输入DF相同)并返回一个函数输出数据框。通过堆叠每个子集获得的所有df构建的数据帧将具有与输入DF完全相同的格式。我需要进一步的应用程序来合并我的输入和输出。

使用do.call(rbind)正在完成工作(子集)并应用函数(创建df)。在这一点上,我不能让ddply工作由于某种原因(似乎函数没有应用),我认为它不适合我的请求:ddply将函数应用于输入并返回修改后的输入。我的输入未被修改,我想返回另一个数据帧。

似乎我无法应用我在函数中找到的任何答案,因为我不知道输出应该有多少行。

编辑2:

由于我的问题似乎已得到充分发展,所以这是我的完整问题:

输入数据帧的前15行(AGG100):

    YEAR    RN  DATE    NOM SITE    LONG    SP  SUMNB   NB100
1   2011    RNN027  15056   ESTAGNOL    RNN027-Estagnol 02  310 Anthocharis cardamines (Linnaeus, 1758) 1   0.3225806
2   2011    RNN027  15075   ESTAGNOL    RNN027-Estagnol 02  310 Anthocharis cardamines (Linnaeus, 1758) 1   0.3225806
3   2003    RNN027  12166   ESTAGNOL    RNN027-Estagnol 03  330 Anthocharis cardamines (Linnaeus, 1758) 2   0.6060606
4   2006    RNN027  13252   ESTAGNOL    RNN027-Estagnol 03  330 Anthocharis cardamines (Linnaeus, 1758) 2   0.6060606
5   2006    RNN027  13257   ESTAGNOL    RNN027-Estagnol 03  330 Anthocharis cardamines (Linnaeus, 1758) 2   0.6060606
6   2005    RNN027  12895   ESTAGNOL    RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758) 2   0.3703704
7   2005    RNN027  12910   ESTAGNOL    RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758) 2   0.3703704
8   2011    RNN027  15075   ESTAGNOL    RNN027-Estagnol 01  540 Anthocharis cardamines (Linnaeus, 1758) 1   0.1851852
9   2008    RNN027  14120   ESTAGNOL    RNN027-Estagnol 05  960 Anthocharis cardamines (Linnaeus, 1758) 2   0.2083333
10  2011    RNN027  15065   ESTAGNOL    RNN027-Estagnol 05  960 Anthocharis cardamines (Linnaeus, 1758) 1   0.1041667
11  2011    RNN027  15075   ESTAGNOL    RNN027-Estagnol 05  960 Anthocharis cardamines (Linnaeus, 1758) 1   0.1041667
12  2007    RNN027  13679   ESTAGNOL    RNN027-Estagnol 05  960 Apatura ilia (Denis & Schifferm�ller, 1775) 2   0.2083333
13  2004    RNN027  12573   ESTAGNOL    RNN027-Estagnol 06  260 Aporia crataegi (Linnaeus, 1758)    2   0.7692308
14  2005    RNN027  12917   ESTAGNOL    RNN027-Estagnol 06  260 Aporia crataegi (Linnaeus, 1758)    2   0.7692308
15  2006    RNN027  13301   ESTAGNOL    RNN027-Estagnol 06  260 Aporia crataegi (Linnaeus, 1758)    2   0.7692308

该数据框填充了9年时不同位点(ESTAGNOL 01至06)的物种(本例中为66)观察结果。

这是我的完整代码:

MIN<-data.frame(matrix(NA, nrow = 100, ncol = 9)) #reglé pour 100 lignes max
colnames(MIN)<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
MAX<-data.frame(matrix(NA, nrow = 100, ncol = 9))
colnames(MAX)<-c("YEAR","RN","DATE","NOM","SITE","LONG","SP","SUMNB","NB100" )
do.call(rbind, by(AGG100, AGG100[c("YEAR","SITE")], FUN = function(x) {
  splist<-unique(x$SP)
  lsp<-length(splist)  
  for (i in 1:lsp){
    MIN$SP[i]<-as.character(splist[i])
    MIN$SITE[i]<-as.character(unique(x$SITE))
    MIN$DATE[i]<-as.character(min(x$DATE) - 7)
    MIN$RN[i]<-as.character(unique(x$RN))
    MIN$YEAR[i]<-as.character(unique(x$YEAR))
    MIN$NOM[i]<-as.character(unique(x$NOM))
    MIN$LONG[i]<-as.numeric(unique(x$LONG))
    MIN$SUMNB[i]<-0
    MIN$NB100[i]<-0
    MAX$SP[i]<-as.character(splist[i])
    MAX$SITE[i]<-as.character(unique(x$SITE))
    MAX$DATE[i]<-as.character(min(x$DATE) + 7)
    MAX$RN[i]<-as.character(unique(x$RN))
    MAX$YEAR[i]<-as.character(unique(x$YEAR))
    MAX$LONG[i]<-as.numeric(unique(x$LONG))
    MAX$SUMNB[i]<-0
    MAX$NB100[i]<-0

  MINMAX<- rbind(MIN,MAX)
  MINMAX<-MINMAX[complete.cases(MINMAX),]   
}

      return(MINMAX)
}))

我能做什么:

- 每个YEAR / SITE组合的子集,以隔离所有物种总和的第一个和最后一个观察日期(时间范围的限制)。用do.call(rbind)或ddply()完成。

在每个物种(66行)的第一次观察前7天,用零观察和日期填充一行填充AGG100的所有相应数据(每9列)。编译名为MIN的df中的行。 - 在最后一次观察后七天创建另一行日期(66行)。在名为MAX的df中编译这些行 - 使用for循环创建的两个行类型,基于每个子集的物种数量。

- 新数据帧(MINMAX)中的MIN和MAX,其格式与输入数据帧相同。

我需要做什么:

- 能够为每个子集返回MINMAX。我目前只进行了最后一次迭代(去年和最后一次)。使用这些MINMAX(MINMAXTOT)构建数据帧。

-Merge MINMAXTOT with AGG100并按日期对结果进行排序。

我希望它现在足够清楚了。我只想在我的脚本中添加一行,在每次迭代时都不会覆盖输出。

编辑3:

 summary(AGG100)
      YEAR            RN            DATE                                      NOM      
 2009   : 775   RNN027 :5360   Min.   :2003-04-17   ESTAGNOL                    :5360  
 2003   : 717   RNN037 :   0   1st Qu.:2005-05-27   ANCIENNES CARRIERES D'ORIVAL:   0  
 2006   : 689   RNN044 :   0   Median :2007-07-13   BAIE DE L'AIGUILLON (VENDEE):   0  
 2008   : 598   RNN046 :   0   Mean   :2007-06-17   CHERINE                     :   0  
 2011   : 557   RNN060 :   0   3rd Qu.:2009-07-16   COMBE LAVAUX-JEAN ROLAND    :   0  
 2004   : 524   RNN066 :   0   Max.   :2011-10-06   COTE DE MANCY               :   0  
 (Other):1500   (Other):   0                        (Other)                     :   0  
                 SITE           LONG                                           SP               SUMNB        
 RNN027-Estagnol 01:1135   Min.   :260.0   Pieris PC (rapae / mannii) #complexe : 651   Min.   :  1.000  
 RNN027-Estagnol 05: 957   1st Qu.:310.0   Polyommatus icarus (Rottemburg, 1775): 482   1st Qu.:  2.000  
 RNN027-Estagnol 04: 951   Median :540.0   Maniola jurtina (Linnaeus, 1758)     : 456   Median :  2.000  
 RNN027-Estagnol 03: 915   Mean   :543.5   Brintesia circe (Fabricius, 1775)    : 446   Mean   :  6.215  
 RNN027-Estagnol 02: 801   3rd Qu.:710.0   Lasiommata megera (Linnaeus, 1767)   : 341   3rd Qu.:  6.000  
 RNN027-Estagnol 06: 601   Max.   :960.0   Pieris brassicae (Linnaeus, 1758)    : 313   Max.   :156.000  
 (Other)           :   0                   (Other)                              :2671                    
 NB100        
 Min.   : 0.1042  
 1st Qu.: 0.3226  
 Median : 0.6452  
 Mean   : 1.2876  
 3rd Qu.: 1.2903  
 Max.   :28.8889  

1 个答案:

答案 0 :(得分:0)

可重现的数据集:

n <- 50
DF <- data.frame(
  VAR1 = sample(letters[1:3], n, replace = TRUE),
  VAR2 = sample(LETTERS[1:5], n, replace = TRUE)
  Y    = runif(n)
)

计算按VAR1VAR2划分的统计信息的示例。

library(plyr)

ddply(
  DF, 
  .(VAR1, VAR2), 
  summarise, 
  MeanOfY = mean(Y), 
  SumOfY  = sum(Y)
)

为了将来参考,请尝试搜索短语“split apply combine”。


更新

问题的最新描述仍然不是很清楚,但似乎你只想添加作为年份和网站功能的新变量。您无需进行任何子集化或重组。

这是您的数据集:

n <- 50
DF <- data.frame(
  YEAR = sample(2000:2013, n, replace = TRUE),
  SITE = sample(LETTERS[1:5], n, replace = TRUE)
  #some other variables
)

这是年份和网站的虚拟功能。将其更改为您需要的任何内容。

do_something <- function(year, site)
{
  ifelse(
    year < 2005,  
    ifelse(
      site %in% c("A", "C", "E"),
      1,
      2
    ),
    3
  )
}

这是添加新变量的一种方法:

DF$NewVar <- with(DF, do_something(YEAR, SITE))