在函数内使用时,R Dplyr top_n不起作用

时间:2017-09-14 09:34:58

标签: r dplyr

我的dplyr功能看起来像这样

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 但事实并非如此。

使用下面的函数(interp没有top_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")

}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我的解决方案,删除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))

}

如果有人提供更有效的方式,请分享