我应该有if声明还是ifelse?

时间:2014-10-07 18:04:41

标签: r

我很擅长使用R并尝试让我听到不同的命令。我有这个简单的代码:

setwd("C:/Research") 

tempdata=read.csv("temperature_humidity.csv")

Thour=tempdata$t

RHhour=tempdata$RH
weather=data.frame(cbind(hour,Thour,RHhour))
head(weather)
if (Thour>25) {
y=0 else {
y=3
}

x=Thour+y*2

x

我只是希望代码从CSV文件中读取Thour(温度),如果它高于25,则在公式中使用y = 0,如果低于25则使用y = 3

我试过ifelse,但它也不起作用。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

我今天已经说了太多次了,但是尽可能地避免ifelse陈述(在大多数情况下非常低效和不必要),请尝试这样做:

c(3, 0)[(Thour >= 25) + 1]

此解决方案将返回TRUE/FALSE的逻辑向量,当添加到1时将被强制转换为0/1并成为1/2,这将是c(3, 0)中的索引

甚至更好的解决方案(@BondedDust在评论中发布)将是:

3*(Thour <= 25)

此解决方案将返回TRUE/FALSE的逻辑向量,当乘以3时将强制转换为0/1

基准比较:

 Thour <- sample(1:100000)
 require(microbenchmark)

 microbenchmark(ifel = {ifelse(Thour < 25 , 0 , 3)}, Bool = {3*(Thour >= 25)})
Unit: microseconds
 expr       min        lq    median        uq      max neval
 ifel 38633.499 41643.768 41786.978 55153.050 59169.69   100
 Bool   901.135  1848.091  1972.434  2010.841 20754.74   100

答案 1 :(得分:1)

这对你有用。只需用适当的代码替换您命名为Thour的内容。

Thour <- sample(1:100, 1)
Thour
# [1] 8
y <- ifelse(Thour >= 25, 0, 3)
y
# [1] 3

Thour <- sample(1:100, 1)
Thour
# [1] 37
y <- ifelse(Thour >= 25, 0, 3)
y
# [1] 0

您可能需要更改逻辑运算符(&gt; =)以匹配您的确切情况,因为它不清楚,如果您希望包含任何更高或更低的范围。

答案 2 :(得分:0)

R语法非常灵活。所以你可以用很多方式写出来:

# ifelse() function
y <- ifelse(Thour > 25, 0, 3)

# more ifelse()
y <- 3 * ifelse(Thour > 25, 0, 1)

# The simpler way:
y <- 3 * (Thour > 25)

顺便说一下,使用<-代替=进行分配......它是&#34;首选&#34;式