首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个条件下的r矢量化

多个条件下的r矢量化
EN

Stack Overflow用户
提问于 2017-05-09 18:33:29
回答 3查看 3.1K关注 0票数 1

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

对于单个温度值,我的R实现工作正常:

代码语言:javascript
复制
# 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,如下所示:

代码语言:javascript
复制
Teff=seq(30,40,1)

我收到以下警告:

代码语言:javascript
复制
Warning message:
In if (Teff < Tcr) { :
  the condition has length > 1 and only the first element will be used

这显然是因为if()没有向量化,因此只计算向量的第一个元素。

我了解了ifelse(),它是向量化的if(),但我不知道如何在多种条件下使用它。

所以,我的问题是:用向量而不是标量来计算我的hsa索引的替代的、矢量化的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-09 20:59:41

这个怎么样?

它与上面的函数相同,但没有显式的ifelse

代码语言:javascript
复制
> 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,那么您必须嵌套它们,所以应该是这样的:

代码语言:javascript
复制
> 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
票数 2
EN

Stack Overflow用户

发布于 2017-05-09 18:44:16

思考这类问题的正确方法是考虑“逻辑索引”。

示例

票数 1
EN

Stack Overflow用户

发布于 2017-05-09 18:54:58

@kandel是对的。更好的方法是使用逻辑索引。

定义逻辑条件

代码语言:javascript
复制
idx <- iris$Species == "setosa"
new_iris = iris[idx,]

在您的示例中,以下内容

代码语言:javascript
复制
if (Teff < Tcr) {
  hsa = 1
} else if (Teff >= Tcr & Teff < Tlim) {
         hsa = 1 - ((Teff - Tcr)/(Tlim - Tcr))
       } else if (Teff >= Tlim) {
hsa = 0
}

翻译成

代码语言:javascript
复制
idx <- Teff< Tcr
hsa[idx] <- 1 # and so on so forth
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43877429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档