【问题标题】:Calculations based on criteria of other variables using loops and plyr使用循环和 plyr 基于其他变量的标准进行计算
【发布时间】: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

感谢您的帮助! 拉夫

【问题讨论】:

  • 预期输出是什么?

标签: r for-loop plyr


【解决方案1】:

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

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)

【讨论】:

  • 嗨@TUSHAr,非常感谢您的回答,这真的很有帮助!一个问题:当条件不满足时(即 diff RR<-dlply(.data = DF,.variables = "Loc",.fun = RatioByLoc) RR$L2<-RR$L2[which(RR$L2>0)]
  • 我的编辑不是很优雅和高效,所以我欢迎更好的方法。
  • @RaphLavoie 你确定next 正在生成 0 吗?我不确定。在这种情况下,您可以将next 替换为Ratio[i]&lt;-NA。如果你能提供你得到 0 的数据,我可以检查一下。
  • 嗨@tushar,如果上述v2向量替换为以下:v2&lt;-c(14,15,16,17,6,7,8,15),则在选择15时将生成0s。您将 next 替换为 Ratio[i]&lt;-NA 的修复解决了该问题并给出了 NA 而不是 0。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-14
  • 2015-01-24
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多