【问题标题】:Creating for loops in R using subset data使用子集数据在 R 中创建 for 循环
【发布时间】:2017-11-05 23:23:29
【问题描述】:

我最近开始使用 R 编程,并尝试计算数据集的斜率。这是我的代码:

slopes<- vector()
gdd.values <- length(unique(data.gdd$GDD))
for (i in 1:gdd.values){
  subset.data <- data.gdd[which(data.gdd$GDD==i),]
  volume <- apply(subset.data[,4,6],1,prod)
  species.richness <- apply(subset.data[,7:59],1,sum)
  slopes[i] <- lm(log(species.richness) ~ log(volume))$coefficients[2]
}

当我运行它时,“slopes”值保持为空。所有其他值都很好(没有其他空集)。如果您发现任何明显的错误,请告诉我。谢谢

【问题讨论】:

  • 在您的问题中包含minimal reproducible example 会增加您获得答案的机会。
  • 这绝对不是做你想做的事的好方法。您能否提供您的数据结构。这样我们就可以给你建议
  • 应该是gdd.values &lt;- unique(data.gdd$GDD)for(i in gdd.values)

标签: r for-loop


【解决方案1】:

目前,您正在遍历唯一值的长度,而不是唯一值本身。因此,作为@RobJensen cmets,调整for 循环向量和迭代。因此,为什么部分或全部返回的值会导致丢失,因为 subset.data 可能由于不精确的过滤器而没有包含任何行。

但是,考虑一种更简化的方法,使用经常未被充分利用和被忽视的by() 通过所需的分组因子对数据集进行子集化,并将返回的列表绑定到一个向量中:

coeff_list <- by(data.gdd, data.gdd$GDD, FUN=function(df) {
  volume <- apply(df[,4,6],1,prod)
  species.richness <- apply(df[,7:59],1,sum)
  lm(log(species.richness) ~ log(volume))$coefficients[2]
})

slopes <- do.call(c, coeff_list)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    相关资源
    最近更新 更多