我正在试着用Plyr来运行一把刀。我有一个很大的数据集( 10年内有715个站点)。我已经计算了每年的物种丰富度(存在的所有物种的数量),但现在我想计算新的丰富度值,在一次取出一个物种并将它们都放在一个数据集中之后。
示例数据:
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)
但很明显我在某处犯了个错误!有什么想法吗?
发布于 2011-11-17 18:38:02
使用您的示例数据和对ddply的调用,将会发生以下情况:
ddply将在dataset的SpID列(1、2和3)中找到不同的值。data.frame。data.frame,每次传递一个data.frame作为第一个参数< SpID >F215data.frame>
因此,现在很明显,这将不会有助于做刀锋。事实上,我没有看到使用plyr实现这一点的明显方法。在这种特殊情况下,您最好使用类似的逻辑来操纵您自己的逻辑。类似于:
listOfResults <-
lapply(unique(data$SpID),
function(curID) {
curDF<-data[data^SpID!=curID,]
summaryBy(...,data=curDF)
})然后你可以用?do.call重新组合你的结果。
https://stackoverflow.com/questions/8165480
复制相似问题