【发布时间】:2018-02-03 03:52:59
【问题描述】:
这是我想做的简化示例。我有来自 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 (v2) 满足特定标准的物种 2 (Sp2) 的所有值 (v1)。例如,我选择 Sp1 的 v1 的“随机”值: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
感谢您的帮助! 拉夫
【问题讨论】:
-
预期输出是什么?