我正在尝试使用if else做一些计算,但我可以得到它:
我有从模型中获得的数据,但该模型倾向于高估或低估结果,具体取决于总结果。 我举一个简单的例子:
d <- c(2,2,12,10, 24,30,50,55,60)
e <- c("red", "white", "red")
car <- data.frame(d,e)
names(car) <- c("carro","Color") # variable names
if(car$carro < 10){
car$carro <- car$carro * 0.5 ##50%
} else {
if((car$carro> 10) && (car$carro < 30)){
car$carro <- car$carro * 0.9 #90%
} else {
if(car$carro >30) {
car$carro <- car$carro * 1.50 #150%
}
}
}
但是,当我运行脚本时,它只假设所有数据的第一个条件(50%)。
答案 0 :(得分:0)
你在R控制台中看到任何输出吗?
在我的电脑上,它说:
Warning message:
In if (car$carro < 10) { :
the condition has length > 1 and only the first element will be used
基本上,car$carro
是一个等于d
的列表。由于R在将列表与数字进行比较时不知道如何输出TRUE / FALSE,因此它可能使用第一个列表元素2与10进行比较并输出TRUE,因为2&lt; 10.然后它将car$carro
中的每个元素乘以0.5。
答案 1 :(得分:0)
正如@ user13534已经说过你要将一个列表与一个数字进行比较。以下是我将如何做到这一点:
d <- c(2,2,12,10, 24,30,50,55,60)
e <- c("red", "white", "red")
car <- data.frame(d,e)
names(car) <- c("carro","Color") # variable names
car$carro <- lapply(car$carro, function(x) ifelse(x < 10, x * 0.5, ifelse(x < 30 && x > 10, x * 0.9, x * 1.5)))
car
carro Color
1 1 red
2 1 white
3 10.8 red
4 15 red
5 21.6 white
6 45 red
7 75 red
8 82.5 white
9 90 red
ifelse
非常适合这一点。出于可读性目的,总是尝试在编程时利用else if
条件,而不是在else条件中包含if条件。
答案 2 :(得分:0)
在帖子中,条件不明确。例如,car$carro < 10
,(car$carro> 10) && (car$carro < 30)
,car$carro >30
不包括'carro'为10或30时的情况。我假设第一个条件是car$carro < 10
,第二个作为(car$carro>=10) & (car$carr < 30)
,第三作为car$carro >=30
。
这可以在不使用ifelse
的情况下轻松完成。我们通过指定cut
来创建包含breaks
的分组索引。
grp <- cut(car$carro, breaks=c(-Inf, 10, 30, Inf), right=FALSE, labels=FALSE)
然后,我们使用此数字索引将值与'carro'列相乘。
car$carro <- car$carro * c(0.5, 0.9, 1.5)[grp]
car$carro
#[1] 1.0 1.0 10.8 9.0 21.6 45.0 75.0 82.5 90.0