首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Plyr用于刀切式数据子设置

Plyr用于刀切式数据子设置
EN

Stack Overflow用户
提问于 2011-11-17 18:18:40
回答 1查看 282关注 0票数 1

我正在试着用Plyr来运行一把刀。我有一个很大的数据集( 10年内有715个站点)。我已经计算了每年的物种丰富度(存在的所有物种的数量),但现在我想计算新的丰富度值,在一次取出一个物种并将它们都放在一个数据集中之后。

示例数据:

代码语言:javascript
复制
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。

我已经尝试使用以下代码:

代码语言:javascript
复制
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)

但很明显我在某处犯了个错误!有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-17 18:38:02

使用您的示例数据和对ddply的调用,将会发生以下情况:

  • ddply将在dataset的SpID列(1、2和3)中找到不同的值。
  • 接下来,它将为每个唯一值创建一个data.frame
  • 这些代码中的每一个都将仅包含其代码等于该唯一值的行(因此:现在将调用具有第一行和第四行、第二行和第五行以及第三行和最后一行rows)
  • Function的data.frame,每次传递一个data.frame作为第一个参数

< SpID >F215data.frame>

因此,现在很明显,这将不会有助于做刀锋。事实上,我没有看到使用plyr实现这一点的明显方法。在这种特殊情况下,您最好使用类似的逻辑来操纵您自己的逻辑。类似于:

代码语言:javascript
复制
listOfResults <- 
    lapply(unique(data$SpID), 
           function(curID) {
               curDF<-data[data^SpID!=curID,]
               summaryBy(...,data=curDF)
           })

然后你可以用?do.call重新组合你的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8165480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档