我很擅长使用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,但它也不起作用。
感谢您的帮助。
答案 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;式