2017-06-12 198 views
1

我想計算比率(A/B = C)。然後我想爲比率分配一個標籤。如果比率等於0,則標籤獲得「0」。如果值小於1的標籤獲得「1」。最後比例大於1的標籤獲得「2」。R if else with for循環

下面是示例數據:

    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個標籤。我無法弄清楚問題出在哪裏。任何想法?

回答

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

所以我想用一個非常困難的方式來解決這個問題。感謝這個非常簡單的解決方案!下一次,我會先考慮簡單... – silverstone

0

我強烈建議你學習ifelse功能。您可以嵌套它並獲取複雜的條件語句之後的向量。爲了您的例子我會使用類似:

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

是的,我認爲ifelse函數,但我有3個標籤。所以我無法弄清楚如何在其他情況下使用3個標籤。也許它可以嵌套,但就像我說的:我無法弄清楚!感謝你的回答。 – silverstone

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

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