2013-12-16 103 views
0

我在保存數據幀中的循環輸出時遇到了一些問題。由於我的劇本太複雜在這個問題加以解釋,這裏是我的代碼的簡化版本: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爲每個子集。我如何用我所有的「df」構建一個新的數據框(TOT)在彼此之上?

注意:我不知道每個「df」將會有多少行,這就是爲什麼我設置了最多100行,然後立即刪除NA行。但DF和DF有相同的列。

感謝您的幫助!

編輯:

我的觀點是子集每年/別組合,適用的功能,它(建基於每個子集與改變的日期填充數據的DF,在比輸入的格式相同DF)並在數據幀中返回函數輸出。這個數據幀,通過堆疊我爲每個子集獲得的所有DF而構建,將具有與我的輸入DF完全相同的格式。我需要進一步的應用程序來合併我的輸入和輸出。

使用do.call(rbind)正在完成作業(子集)和應用函數(創建df)。在這一點上,我不能讓ddply工作出於某種原因(似乎函數不適用),我不認爲它適合我的要求:ddply將該函數應用於輸入並返回修改後的輸入。我的輸入沒有修改,我想返回另一個數據幀。

它似乎我不能應用任何我發現我的功能的答案,因爲我不知道輸出應該有的行數。

編輯2:

正如我的問題似乎完全developped可以理解,這裏是我的全部問題:

第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) 
})) 

我能做些什麼:

-Subset每年/ SITE組合隔離觀察的第一個和最後日期(時空限制範圍)爲所有物種的總和。用do.call(rbind)或ddply()完成。

- 創建一個行,填滿AGG100(每9列)的所有數據,零觀察值和每個物種的第一次觀察(66行)前7天的日期。編譯名爲MIN的df中的行。 - 在最後一次觀察(66行)後7天創建另一行。在稱爲MAX的df中編譯這些行。根據每個子集的物種數量i,使用for循環創建的兩行類型。

- 在新數據幀(MINMAX)中合成MIN和MAX,格式與我的輸入數據幀相同。

我需要做的:

-Be能夠返回MINMAX每個子集。我目前只得到最後一次迭代(上一年和最後一次)。從這些MINMAX(MINMAXTOT)中構建一個數據框。

- 用AGG100合併MINMAXTOT並按日期對結果進行排序。

我希望現在清楚。我只是想添加一行到我的腳本,不覆蓋每次迭代的輸出。

EDIT 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 
+4

此刻,你的例子是不可重現('df'沒有名爲'VAR1'和'SVAR2'列)所以很難理解你想要什麼。是不是由這些變量分裂,然後調用'do.call(rbind)'就像這些變量排序一樣?當你想到你想要的東西時,我會採用標準的建議:看看'plyr'包中的'ddply'。 –

+0

通常,當我給出完整的代碼時,討論的重點是我不想討論的部分(這裏是數據框填充代碼,主要是因爲它是for循環)。我自願不顯示它,因爲我只是想知道一種方法來自動連接在我的函數中獲取的數據框在全局數據框中。我曾經提到過,我的輸入DF和輸出df具有相同的變量(我只是跳過了我命名df的九列的那一行)。不過,我更新了我的帖子。 – user2542995

+0

問題是,你所有的代碼似乎都是分割一個df,然後將它重新綁定在一起,所以很難看到你想要做什麼。 – Thomas

回答

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

我不想用我的輸入計算任何東西。如果我可以在應用部分中運行一個循環,「拆分應用聯合可能是我的解決方案。似乎聯合部分不工作,因爲我在拆分部分是錯誤的。」 – user2542995

+0

查看我的更新後的帖子。 – user2542995