使用循环和 plyr 基于其他变量的标准进行计算

Calculations based on criteria of other variables using loops and plyr

这是我想要做的事情的一个简化示例。我有来自 2 个位置 (Loc) 的 2 个物种 (Sp) 和 2 个变量(v1 和 v2)。

Loc<-c("L1","L2","L1","L2","L1","L2","L1","L2")
Sp<-c("Sp1","Sp1","Sp1","Sp1","Sp2","Sp2","Sp2","Sp2")
v1<-c(3.1, 3.8, 4.1, 4.5, 0.3, 0.4, 0.5, 0.6)
v2<-c(14,15,16,17,6,7,8,9)
DF<-data.frame(Loc, Sp, v1, v2)

我想从物种 1 (Sp1) 的 v1 中选择一个随机值,并除以物种 2 (Sp2) 的所有值 (v1),这些值满足基于变量 2 (v2) 的特定条件。因此,例如,我选择了 Sp1 的 v1 的 "random" 值:3.1。 只有当 Sp1 和 Sp2 之间的 v2 差异 >=3 时,我才想将它与 Sp2 的 v1 相除。在这种情况下,3.1 可以除以任何值,因为 14 与任何其他值之间的差值大于 3。 这是我想出的:

Ratio<-numeric(length(v1))
for (i in 1:length(v1)) {
    X1<-sample(DF[which(Sp=="Sp1"),],1, replace=F)
    X2<-sample(DF[which(Sp=="Sp2"),],1, replace=F)
    if(X1$v2-X2$v2>=3) {
      Ratio[i] <- X1$v1/X2$v1
      } else {
      next
        }
}
Ratio

现在我想这样做,但要针对每个站点分别进行。换句话说,只有当两个物种位于同一位置时才应计算比率。我相信 ddply 可以用于此目的。但是,我无法让 ddply 函数正常工作并计算每个位置的比率。它给出了一个包含 0 个 obs 和 0 个变量的空数据框。

RatioByLoc<-ddply(DF, .(Loc), function(x) {
for (i in 1:length(v1)) {
  X1<-sample(DF[which(x$Sp=="Sp1"),],1, replace=F)
  X2<-sample(DF[which(x$Sp=="Sp2"),],1, replace=F)
  if(X1$v2-X2$v2>=3) {
    Ratio[i] <- X1$v1/X2$v1
  } else {
    next
  }
}
})
RatioByLoc

感谢您的帮助! 拉夫

如果这能解决您的问题,请告诉我。我稍微调整了函数定义。

RatioByLoc<-function(x) {
    Ratio=numeric(length(x$v1))
    for (i in 1:length(x$v1)) {
        X1<-sample(which(x$Sp=="Sp1"),1, replace=F)
        X2<-sample(which(x$Sp=="Sp2"),1, replace=F)
        if(x$v2[X1]-x$v2[X2]>=3) {
            Ratio[i] <- x$v1[X1]/x$v1[X2]
        } else {
            next
        }
    }
    Ratio
}

ddply(.data = DF,.variables = "Loc",.fun = RatioByLoc)