2016-06-14 19 views
0

我有一個df(請參考下文),我需要根據df中的一列創建一個標誌。falg應該基於預定義的值。在R中創建一個最接近列的標誌

Year Month Budget percentage_change 
2014 Feb $ 2,285,940  61.993 
2014 Feb $ 2,294,280  62.219 
2014 Feb $ 2,356,192  63.898 
2014 Feb $ 2,356,192  63.898 
2014 Feb $ 2,359,000  64.000 
2014 Feb $ 2,359,255  65.000 
2014 Feb $ 2,359,372  70.000 
2015 Feb $ 2,465,829  68.905 
2015 Feb $ 2,475,187  68.912 
2015 Feb $ 2,475,596  68.918 
2015 Feb $ 2,480,543  69.472 
2015 Feb $ 2,499,953  69.472 
2015 Feb $ 2,500,021  69.702 
2015 Feb $ 2,503,888  69.787 
2015 Feb $ 2,503,888  70.041 

所需的輸出我找下面

Year Month   Budget percentage_change Flag 
2014 Feb $  2,285,940   61.993  0 
2014 Feb $  2,294,280   62.219  0 
2014 Feb $  2,356,192   63.898  0 
2014 Feb $  2,356,192   63.898  0 
2014 Feb $  2,359,000   64.000  0 
2014 Feb $  2,359,255   65.000  0 
2014 Feb $  2,359,372   70.000  1 
2015 Feb $  2,465,829   68.905  0 
2015 Feb $  2,475,187   68.912  0 
2015 Feb $  2,475,596   68.918  0 
2015 Feb $  2,480,543   69.472  0 
2015 Feb $  2,499,953   69.472  0 
2015 Feb $  2,500,021   69.702  0 
2015 Feb $  2,503,888   69.787  0 
2015 Feb $  2,503,888   70.041  1 

提到當創建標誌是基於值,其中的百分比變化列值最接近71

這個問題我有數據很長,百分比在基於Year和Month的每個確定的Inverval後都會重複。

回答

0

假設您的數據位於名爲mydfdata.frame中。我們需要對組執行此操作,所以我們可以使用dplyr如下:

library(dplyr) 
mydf <- mydf %>% 
    group_by(Year, Month) %>% 
    mutate(Flag = ifelse(abs(percentage_change - 71) == min(abs(percentage_change - 71)), 1, 0)) 

mydf 
     Year Month Budget percentage_change Flag 
    1 2014 Feb 2,285,940   61.993  0 
    2 2014 Feb 2,294,280   62.219  0 
    3 2014 Feb 2,356,192   63.898  0 
    4 2014 Feb 2,356,192   63.898  0 
    5 2014 Feb 2,359,000   64.000  0 
    6 2014 Feb 2,359,255   65.000  0 
    7 2014 Feb 2,359,372   70.000  1 
    8 2015 Feb 2,465,829   68.905  0 
    9 2015 Feb 2,475,187   68.912  0 
    10 2015 Feb 2,475,596   68.918  0 
    11 2015 Feb 2,480,543   69.472  0 
    12 2015 Feb 2,499,953   69.472  0 
    13 2015 Feb 2,500,021   69.702  0 
    14 2015 Feb 2,503,888   69.787  0 
    15 2015 Feb 2,503,888   70.041  1 
+0

謝謝@ bouncyball.This很少除了與as.numeric代碼中的if else .The之前爲我工作最終的代碼看起來像 mydf <- mydf %>% group_by(Year,Month)%>% mutate(Flag = as.numeric(ifelse(abs(percentage_change - 71)== min(abs(percentage_change - 71)), 0))) 它忽略了錯誤#incompatible類型,期望一個數值向量以供mutate使用。 –

0

你可以從預定值減去列,取絕對值,並找到最低。

這裏有一個功能,所以它可以在多個數據集和多列被複制:

createFlag <- function(column, value) { 
    return(ifelse(abs(column-value)==min(abs(column-value), na.rm=T), 1, 0)) 
} 

mydf$Flag <- createFlag(mydf$percentage_change, 71)