2011-11-17 44 views
1

我正在嘗試使用Plyr運行千斤頂刀。我有一個很大的數據集(超過10年715個網站)。我已經計算了每年在一個正方形中的物種豐富度(存在的所有物種的數量),但是現在我想在計算一次取出一個物種並將它們全部放入一個數據集中之後計算新的豐富度值。針對千斤頂刀數據子集的Plyr

示例數據:

Site <- c(1,1,1,1,1,1) 
Year <- c(96,96,96,97,97,97) 
SpID <- c(1,2,3,1,2,3) 
Count <- c(1,1,1,1,1,1) 
data <- cbind(Site, Year, SpID) 

所以總體來說站點1物種豐富度在兩年內3。如果我想重新計算這個沒有的物種之一,現在是2

我曾嘗試使用下面的代碼:

foo<-function(z){ 
    data2 <- subset(data, SpID != (z)) 
    summaryBy(Count~ Year + Site, 
       data = data2, 
       FUN = function(x) { c(l = length(x)) }) 
} 

richall<- ddply(data,.(SpID),foo)

但我顯然犯了一個錯誤的地方!有什麼想法嗎?

回答

1

你的榜樣數據和來電ddply,這是會發生什麼:

  • ddply會在你 數據集的SPID列找到不同的值(1,2和3)
  • 它接下來將爲這些獨特值中的每一個創建一個data.frame
  • 每個data.frame旨意僅握住行的量, SPID等於唯一值(這樣的:一個data.frame與第一 行和第四行,一個與第二和第五和一個與所述第三 和最後行)
  • 函數foo現在將被調用,通過每一個這些data.frame小號 一次一個作爲第一個參數

所以它現在是相當明顯的,這不會做折刀幫助。事實上,我沒有看到用plyr實現這個目標的明顯方法。在這種特殊情況下,你可能更喜歡用類似的邏輯來操縱自己。例如:

listOfResults <- 
    lapply(unique(data$SpID), 
      function(curID) { 
       curDF<-data[data^SpID!=curID,] 
       summaryBy(...,data=curDF) 
      }) 

然後,您可以將結果重新與例如?do.call

+0

謝謝@NicKSabbe這是非常好的...這裏結束了兩天的挫折! – CDavey