2017-08-10 50 views
0

我想在R中採樣不同數量的行的數據幀。我想獲得N行的示例,它們共享一個給定的屬性(在我的情況下, cell_id_25km)多次。根據每個樣本 N行,我想申請一個函數(換句話說:做一些事情並保存結果)。在R循環中採樣不同數量的行

這裏是我使用沒有成功的代碼:

我的數據幀(DF)的例子:

cell_id_25km latitude longitude date_collected N_rec species id_species 

    101064 -23.625 30.125  1924-03-31 2142 sp.783   1   
    101064 -23.600 30.100  1982-01-24 2142 sp.783   1   
    101064 -23.625 30.125  1968-03-15 2142 sp.783   1   
    101064 -23.625 30.125  1918-02-28 2142 sp.783   1   
    101064 -23.625 30.125  1960-02-29 2142 sp.783   1   
    101064 -23.625 30.125  1958-01-13 2142 sp.783   1   

我試圖代碼:

nrep<-100 

cell=unique(df$cell_id_25km) 

tt3<-c() 

tt4<-c() 

tt5<-c() 

    for(j in 1:nrep){ 
     u[j]<- round(runif(1, min = 100, max = 1000), digits = 0) 
     for (i in 1:length(cell)) { 
     for (k in 1:length(u[j])){ 
      dat3 = df[df$cell_id_25km == cell[i], c("cell_id_25km", "id_species", "species")] 
      tt4[[k]] <- sample_n(dat3, u[j], replace = FALSE) 
      tt5[[k]]<- length(unique(tt4$species))}}} 

我認爲我沒有正確保存循環的結果。

+0

uu2從哪裏來? – Kevin

+0

抱歉沒有提及它。這是我的數據框。 – user2120294

回答

0

我覺得你的問題是在這條線: tt5[[k]] <- length(unique(tt4$species))

它改成這樣: ​​

爲了節省您的結果,我會做血清TT3,TT4,TT5和名單。然後,將tt5更改爲包含j,i和k以保存結果(否則只需使用k重寫結果)。

添加這些變化:

`tt3 <- list() 
tt4 <- list() 
tt5 <- list() 
tt5[[paste(j, i, k, sep = " ")]] <- length(unique(tt4[[k]]$species))` 

你的代碼後,你可以通過使用do.calldo.call(rbind, tt5))所有的結果。

`nrep<-100 

cell=unique(df$cell_id_25km) 

tt3<-list() 

tt4<-list() 

tt5<-list() 

u <- list() 

for(j in 1:nrep){ 
    u[j]<- round(runif(1, min = 100, max = 1000), digits = 0) 
    for (i in 1:length(cell)) { 
    for (k in 1:length(u[j])){ 
     dat3 = df[df$cell_id_25km == cell[i], c("cell_id_25km", "id_species", "species")] 
     tt4[[k]] <- sample_n(dat3, as.numeric(u[j]), replace = FALSE) 
     tt5[[paste(j,i,k,sep=" ")]]<- length(unique(tt4[[k]]$species))}}} 


do.call(rbind, tt5)` 
+0

嗨,謝謝!我無法確切知道如何改變tt5以包含j,i和k來保存結果。你能提供一個代碼示例嗎?謝謝! – user2120294

+0

我編輯了我的答案以顯示我在代碼中所做的更改。 – user108363

+0

謝謝!是的,現在的代碼工作! – user2120294