我试图计算一个取决于三个不同温度的热应力指数,如下所示:

对于单个温度值,我的R实现工作正常:
# Set temperatures
Teff=34
Tcr=33
Tlim=40
# Apply conditions
if (Teff < Tcr) {
hsa = 1
} else if (Teff >= Tcr & Teff < Tlim) {
hsa = 1 - ((Teff - Tcr)/(Tlim - Tcr))
} else if (Teff >= Tlim) {
hsa = 0
}
hsa
[1] 0.8571429但是,如果我试图计算hsa范围的Teff,如下所示:
Teff=seq(30,40,1)我收到以下警告:
Warning message:
In if (Teff < Tcr) { :
the condition has length > 1 and only the first element will be used这显然是因为if()没有向量化,因此只计算向量的第一个元素。
我了解了ifelse(),它是向量化的if(),但我不知道如何在多种条件下使用它。
所以,我的问题是:用向量而不是标量来计算我的hsa索引的替代的、矢量化的方法是什么?
发布于 2017-05-09 20:59:41
这个怎么样?
它与上面的函数相同,但没有显式的if和else
> Teff=seq(30,40,1)
> hsa<- 1*(Teff<Tcr) + (1 - (Teff - Tcr)/(Tlim - Tcr))*(Teff >= Tcr & Teff < Tlim)
> hsa
[1] 1.0000000 1.0000000 1.0000000 1.0000000 0.8571429 0.7142857 0.5714286 0.4285714 0.2857143 0.1428571 0.0000000**请注意,您可以在最后添加+ 0*(Teff>=Tlim),但是它不会改变任何东西,因为赋值无论如何都是0。
如果您真的想使用ifelse,那么您必须嵌套它们,所以应该是这样的:
> hsa<- ifelse(Teff<Tcr, 1,
ifelse(Teff >= Tcr & Teff < Tlim,
(1 - (Teff - Tcr)/(Tlim - Tcr)), 0))
> hsa
[1] 1.0000000 1.0000000 1.0000000 1.0000000 0.8571429 0.7142857 0.5714286 0.4285714 0.2857143 0.1428571 0.0000000发布于 2017-05-09 18:44:16
思考这类问题的正确方法是考虑“逻辑索引”。
示例
发布于 2017-05-09 18:54:58
@kandel是对的。更好的方法是使用逻辑索引。
定义逻辑条件
idx <- iris$Species == "setosa"
new_iris = iris[idx,]在您的示例中,以下内容
if (Teff < Tcr) {
hsa = 1
} else if (Teff >= Tcr & Teff < Tlim) {
hsa = 1 - ((Teff - Tcr)/(Tlim - Tcr))
} else if (Teff >= Tlim) {
hsa = 0
}翻译成
idx <- Teff< Tcr
hsa[idx] <- 1 # and so on so forthhttps://stackoverflow.com/questions/43877429
复制相似问题