2017-09-14 131 views
1

我dplyr功能看起来像这样[R Dplyr top_n不起作用

convert_to_top5_df=function(df) 

{ 
    require(dplyr) 
    require(lazyeval) 
    require(tidyr) 

    df %>% 
    filter(!is.na(SVM_LABEL_QOL)) %>%   
    select(globalsegment,Account,SVM_LABEL_QOL) %>% 
    group_by(globalsegment,Account) %>% 
    summarise_(QoL=interp(~round(sum(SVM_LABEL_QOL %in% 'QoL')/n(),2))) %>% 
    ungroup(globalsegment,Account) %>% 
    arrange(desc(QoL)) %>% 
    interp(~top_n(5,wt = "QoL")) 

} 

我加了interp说法,因为我认为这个问题是由于lazyeval 然而,这并非如此。

使用下面的函数(没有interptop_n),我得到一个结果,但是我没有看到前5个结果。

阅读其他stackoverflow帖子,我知道这与ungroup,但不知道如何实现这一点。

convert_to_top5_df=function(df) 

{ 
    require(dplyr) 
    require(lazyeval) 
    require(tidyr) 

    df %>% 
    filter(!is.na(SVM_LABEL_QOL)) %>% 
    select(globalsegment,Account,SVM_LABEL_QOL) %>% 
    group_by(globalsegment,Account) %>% 
    summarise_(QoL=interp(~round(sum(SVM_LABEL_QOL %in% 'QoL')/n(),2))) %>% 
    ungroup(globalsegment,Account) %>% 
    arrange(desc(QoL)) %>% 
    top_n(5,wt = "QoL") 

} 

任何想法?

回答

0

我solutionn,从QoL取出倒报价,并添加一个额外的参数arrange

#Function to convert dataframe for pie chart analysis (Global) 
convert_to_top5_df=function(df) 

{ 

require(dplyr) 
require(lazyeval) 
require(tidyr) 

df %>% 
filter(!is.na(SVM_LABEL_QOL)) %>%   
select(globalsegment,Account,SVM_LABEL_QOL) %>% 
group_by(globalsegment,Account) %>% 
summarise_(QoL=interp(~round(sum(SVM_LABEL_QOL %in% 'QoL')/n(),2))) %>% 
top_n(5,QoL) %>% 
arrange(globalsegment,desc(QoL)) 

} 

如果任何人有一个更有效的方式,请分享