使用循环和 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)
这是我想要做的事情的一个简化示例。我有来自 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)