R if if with for for循环

时间:2017-06-12 07:28:46

标签: r loops if-statement

我想计算比率(A / B = C)。然后我想为比率分配一个标签。如果比率等于0,则标签得到" 0"。如果小于1个标签的值得到" 1"。最后,比率大于1标签得到" 2"。

以下是示例数据:

                    A            B         C
  1                 0        171.06  0.0000000
  2                 1             2  0.5
  3                 0        120.84  360.00000
  4                 0        308.07  0.0000000
  5                 0        243.06  0.0000000
  6                 0       876.015  0.0000000

以下是循环函数:

targets <- function(data)
{
  label_df <- data[,c("A", "B")]
    label_df[is.na(label_df)] <- 0
    label_df["C"] <- (label_df["A"] / label_df["B"]) 
    for(i in 1:nrow(label_df))
    {
      if(label_df$C == 0){label_df[i,"C"] <- 0}

       else if(label_df$C < 1){label_df[i,"C"] <- 1}
       else {label_df[i,"C"] <- 2}
      }
return(as.data.frame(label_df))
    }

这是结果。它显示所有标签0.

lab <- target(data)      
head(lab)      

                    A            B         C      label     
  1                 0        171.06  0.0000000    0
  2                 1             2  0.5          0
  3                 0        120.84  360.00000    0
  4                 0        308.07  0.0000000    0
  5                 0        243.06  0.0000000    0
  6                 0       876.015  0.0000000    0

我用table()函数检查结果,它只显示标签0的所有数据。没有1或2个标签。我无法弄清楚问题出在哪里。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我们可以使用cut

执行此操作
df1$label <- cut(df1$C, breaks = c(-Inf,0, 1, Inf), labels = c(0, 1, 2))

findInterval

findInterval(df1$C, c(0, 1, Inf), left.open = TRUE)

答案 1 :(得分:1)

df$D=ifelse(df$C<=1,1,2)

df$D=ifelse(df$C==0,0,df$D)

答案 2 :(得分:0)

我强烈建议您学习 ifelse 功能。您可以嵌套它并获取复杂条件语句后的向量。对于你的例子,我会使用类似的东西:

ifelse ( ratio == 0, 0, ifelse (ratio < 1, 1,2))