我正在尝试使用if else函数制作算法

时间:2015-08-06 04:01:23

标签: r if-statement

我正在尝试使用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%)。

3 个答案:

答案 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