2016-07-29 69 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

感谢您的帮助,它现在可以工作。 –