在dplyr中使用group by并计算百分比

10

我将以下数据框中的内容导入到了R中

   Service      Container_Pick_Day
    ABC              0
    ABC              1
    ABC              1
    ABC              2
    ABC              NA
    ABC              0
    ABC              1
    DEF              NA
    DEF              0
    DEF              1
    DEF              1
    DEF              1
    DEF              2
    DEF              1

Container_Pick_Day 是数值型的,并包含 NA 值。 我想要做的是计算每个 Service0天、1天、2天等 后提取容器的百分比,忽略 NA 值。

期望得到的数据框如下:

 Service      Container_Pick_Day      Percentage
    ABC              0                (2/6)*100 = 33.33 
    ABC              1                (3/6)*100 = 50  
    ABC              2                (1/6)*100 = 16.67
    DEF              0                (1/6)*100 = 16.67
    DEF              1                (3/6)*100 = 50
    DEF              2                (1/6)*100 = 16.67

我在R中进行了以下操作,但输出结果中出现了NA值。
  df%>% 
     group_by(Service) %>%
     summarise(pick_day_perc = n()/sum(Container_Pick_Day),na.rm=T) %>% 
     as.data.frame()

我需要按照 ServiceContainer_Pick_Day 两个方面进行分组吗?


1
看起来你只需要 sum(Container_Pick_Day, na.rm=TRUE) - Remko Duursma
我想要按服务分类和日期获取集装箱提取百分比。即在同一天、第1天、第2天提取的集装箱百分比。 - Neil
2
也许可以像这样:df%>% filter(!is.na(Container_Pick_Day))%>% group_by(Service,Container_Pick_Day)%>% summarise(Percentage = n())%>% group_by(Service)%>% mutate(Percentage = Percentage / sum(Percentage)* 100)。猜测还有更简洁的解决方案。 - nicola
3
你可以使用count函数,即df %>% filter(complete.cases(Container_Pick_Day)) %>% count(Service, Container_Pick_Day) %>% group_by(Service) %>% transmute(Container_Pick_Day, Percentage=n/sum(n)*100)。这将计算每个服务下完整数据中Container_Pick_Day的频数,并按服务进行分组,并在最终结果中显示Container_Pick_Day和该日占其服务总选箱数的百分比。 - akrun
1
@nicola 提供的代码稍有不同,可以是 df %>% na.omit() %>% group_by_all() %>% summarise(ptg = n()) %>% group_by(Service) %>% mutate(ptg = prop.table(ptg)*100) - Sotos
显示剩余3条评论
1个回答

26

基于 @nicola、@akrun 和我自己上面所有评论的内容,我添加了一个答案:

library(dplyr)

#nicola
df %>% 
 filter(!is.na(Container_Pick_Day)) %>% 
 group_by(Service,Container_Pick_Day) %>% 
 summarise(Percentage=n()) %>% 
 group_by(Service) %>% 
 mutate(Percentage=Percentage/sum(Percentage)*100)

#akrun
df %>% 
 filter(complete.cases(Container_Pick_Day)) %>% 
 count(Service, Container_Pick_Day) %>% 
 group_by(Service) %>% 
 transmute(Container_Pick_Day, Percentage=n/sum(n)*100)

#Sotos
df %>% 
 na.omit() %>% 
 group_by_all() %>% 
 summarise(ptg = n()) %>% 
 group_by(Service) %>% 
 mutate(ptg = prop.table(ptg)*100)
所有的结果都指向,
Service Container_Pick_Day Percentage
   <fctr>              <int>      <dbl>
1     ABC                  0   33.33333
2     ABC                  1   50.00000
3     ABC                  2   16.66667
4     DEF                  0   16.66667
5     DEF                  1   66.66667
6     DEF                  2   16.66667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接