2016-07-29 125 views
4

我寫了一段代碼來計算感興趣變量的累積值(通過十分位數)。 我的數據看起來像這樣:r:在計算累積值時用NA替換爲0

library(dplyr) 
actual=c(1,1,1,0,0,1,1,0,0,1) 
prob=c(0.8,0.8,0.2,0.1,0.6,0.7,0.8,0.9,0.7,0.9) 
n=1:10 
for_chart=data.frame(actual,prob,n) 
for_chart=for_chart[with(for_chart, order(-prob)),] 
for_chart$decile <- cut(n, breaks = quantile(n, probs = seq(0, 1, 0.1)), 
         labels = 1:10, include.lowest = TRUE) 

這是建立表,並計算累計值的代碼。

out <- for_chart%>% 
    group_by(decile)%>% 
    summarise(sum=n())%>% 
    mutate(cum=cumsum(sum)) 
out1 <-for_chart%>% 
    filter(actual==1)%>% 
    group_by(decile)%>% 
    summarise(sum_churn=n())%>% 
    mutate(cum_churn=cumsum(sum_churn)) 
final_out <- left_join(out,out1,by='decile') 

「out」給出了n的累計計數。 「out1」提供感興趣變量的累計值,在這種情況下爲「cum_churn」。 「final_out」是決賽桌。當特定十進制的變量的計數爲0時,代碼放入一個NA。像這樣:

final_out 
    decile sum cum sum_churn cum_churn 
     (fctr) (int) (int)  (int)  (int) 
    1  1  1  1  NA  NA 
    2  2  1  2   1   1 
    3  3  1  3   1   2 
    4  4  1  4   1   3 
    5  5  1  5   1   4 
    6  6  1  6   1   5 
    7  7  1  7  NA  NA 
    8  8  1  8  NA  NA 
    9  9  1  9   1   6 
    10  10  1 10  NA  NA 

,我想我的代碼: 1.累計次數爲0替換港定居人士及 2. 包括0

需要明確的是,最終的輸出應這樣的:

decile sum cum sum_churn cum_churn 
    (fctr) (int) (int)  (int)  (int) 
1  1  1  1   0   0 
2  2  1  2   1   1 
3  3  1  3   1   2 
4  4  1  4   1   3 
5  5  1  5   1   4 
6  6  1  6   1   5 
7  7  1  7   0   5 
8  8  1  8   0   5 
9  9  1  9   1   6 
10  10  1 10   0   6 
+0

我猜你想在'left_join'之後替換NA,因爲在此之前我沒有得到任何NA(請使用'set.seed'使這個可重現) – akrun

+0

你的期望輸出是什麼? – Arun

+0

是的,對不起。現在添加set.seed。 –

回答

4

我們可以嘗試

left_join(out,out1,by='decile') %>% 
     mutate_each(funs(replace(., is.na(.), 0)), sum_churn:cum_churn) 
+1

感謝您的幫助,它現在可以工作。 –