【问题标题】:R: Group_by function is not aggregating data correctly with sum & max/min dateR:Group_by 函数未使用总和和最大/最小日期正确聚合数据
【发布时间】:2019-08-19 16:02:46
【问题描述】:

我有 6 个变量的数据:EmployeeID、JobID、Name、JobLocation、Date 和 HoursWorked。我想按 EmployeeID 和 JobID 对我的数据进行分组(即在一行中查找具有相同 EmployeeID 和 JobID 的所有记录),然后按组查找最小和最大日期,以及这些日期之间所有 HoursWorked 的总和。我希望我的数据以列结尾:EmployeeID、JobID、Name JobLocation、MinDate、MaxDate、TotalHoursWorked。

到目前为止,我已经尝试过了,但 MinDate、MaxDate 和 TotalHoursWorked 显示每条记录的日期相同。

Data$EmployeeID<- as.factor(Data$EmployeeID) 
Data$JobID<- as.factor(Data$JobID) 
Data$Date<- as.factor(Data$Date)
Data$Date<- as.Date(Data$Date,format="%m/%d/%Y")
Data$HoursWorked<-as.numeric(Data$HoursWorked)

Data<-Data[c("EmployeeID", "Name","JobID", "JobLocation", "Date", "HoursWorked")]
Data<- Data%>% 
  group_by(Data$EmployeeID,Data$JobID, Data$Name,Data$JobLocation) %>%
  summarize(TotalHoursWorked = sum(Data$HoursWorked)) %>%
  mutate(MaxDate=max(Data$Date), MinDate=min(Data$Date))

不带“名称”列的样本(数据)输出:

> sample(Data)
# A tibble: 1,000 x 5
   EmployeeID HoursWorked JobID           Date       JobLocation
   <fct>            <dbl> <fct>           <date>     <chr>         
 1 32589              4   B3031-002513-00 2016-03-14 #             
 2 32590              8   B3031-002562-00 2016-04-08 #             
 3 32591              9   B3031-002564-00 2016-04-05 #             
 4 32591              2.5 B3031-002564-00 2016-04-06 #             
 5 32591              3   B3031-002562-00 2016-04-07 #             
 6 32591              7.5 B3031-002562-00 2016-04-08 #             
 7 32605              0   B3031-002348-00 2016-01-04 #             
 8 32605              3   B3031-002419-00 2016-01-04 #             
 9 32605              0   B3031-002348-00 2016-01-05 #             
10 32605              3   B3031-002419-00 2016-01-05 #             
# ... with 990 more rows

运行 group_by 代码后输出:

> sample(Data)
# A tibble: 80 x 6
   MaxDate    `Data$JobID`    MinDate    `Data$\`Job Location\`` TotalHoursWorked `Data$EmployeeID`
   <date>     <fct>           <date>     <chr>                              <dbl> <fct>            
 1 2016-07-29 B3031-002513-00 2016-01-04 #                                  3288. 32589            
 2 2016-07-29 B3031-002562-00 2016-01-04 #                                  3288. 32590            
 3 2016-07-29 B3031-002562-00 2016-01-04 #                                  3288. 32591            
 4 2016-07-29 B3031-002564-00 2016-01-04 #                                  3288. 32591            
 5 2016-07-29 B3031-002348-00 2016-01-04 #                                  3288. 32605            
 6 2016-07-29 B3031-002419-00 2016-01-04 #                                  3288. 32605            
 7 2016-07-29 B3031-002445-00 2016-01-04 #                                  3288. 32605            
 8 2016-07-29 B3031-002502-00 2016-01-04 #                                  3288. 32605            
 9 2016-07-29 B3031-002504-00 2016-01-04 #                                  3288. 32605            
10 2016-07-29 B3031-002505-00 2016-01-04 #                                  3288. 32605            
# ... with 70 more rows

【问题讨论】:

  • 在管道%&gt;%之后你不需要Data$,删除它,问题多次消失。
  • 成功了!但是,EmployeeID 和 JobID 仍然没有被分组,并且总和不起作用。基本上 TotalHoursWorked 仍然显示 HoursWorked 的值,而不是聚合 min 和 max 日期之间的所有 HoursWorked。
  • 我认为这是因为当我真的只想按 EmployeeID 和 JobID 分组时,我按多列分组。有没有办法投影所有列,但只能按这两个列进行分组/聚合?
  • 您可以发布示例数据吗?请使用dput(Data) 的输出编辑问题。或者,如果 dput(head(Data, 20)) 的输出太大。
  • 我不能这样做,因为它是私人数据。还有什么我可以做的吗?

标签: r


【解决方案1】:

其实很简单,你使用的是summarisemutate,而你应该只使用summarise

这第一个指令可能不需要,我在阅读下面的数据后运行它来强制Date 列。

Data$Date <- as.Date(Data$Date)

现在是解决方案。

library(tidyverse)

Data %>%
  group_by(EmployeeID, JobID) %>%
  summarise(TotalHoursWorked = sum(HoursWorked),
            MaxDate = max(Date), MinDate = min(Date))

数据。

Data <- read.table(text = "
EmployeeID HoursWorked JobID           Date       JobLocation
  1 32589              4   B3031-002513-00 2016-03-14 #             
2 32590              8   B3031-002562-00 2016-04-08 #             
3 32591              9   B3031-002564-00 2016-04-05 #             
4 32591              2.5 B3031-002564-00 2016-04-06 #             
5 32591              3   B3031-002562-00 2016-04-07 #             
6 32591              7.5 B3031-002562-00 2016-04-08 #             
7 32605              0   B3031-002348-00 2016-01-04 #             
8 32605              3   B3031-002419-00 2016-01-04 #             
9 32605              0   B3031-002348-00 2016-01-05 #             
10 32605              3   B3031-002419-00 2016-01-05 #   
", header = TRUE, comment.char = "")

【讨论】:

  • 谢谢!那行得通,但是我怎样才能用数据投影其余的列呢? JobLocation 未显示,仅显示 EmployeeID、JobID、TotalHoursWorked、MaxDate 和 MinDate。
  • @Veronica 那是由于summarise,它只保留数据分组的列和它计算的列。看看this 是否有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2019-08-03
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多