R 分组,总结并保留初始订单,无需安排

R 分组,总结并保留初始订单,无需安排,r,dplyr,group-by,R,Dplyr,Group By,我需要在groupby和summary之后保留行顺序 以下是初始数据集: movmnt_id <- c("101", "101", "351", "601","601","351") plant <- c("F5P", "F5D", "F5P", "F5D","F5D&quo

我需要在
groupby
summary
之后保留行顺序

以下是初始数据集:


movmnt_id <- c("101", "101", "351", "601","601","351")
plant <- c("F5P", "F5D", "F5P", "F5D","F5D", "RUP")
loc <- c("CB00", "CB00", "CB00", "CB00","CB00","MOS1")
qty <- c(100, 100,100,10,90,88)
date <- c("2018-01-05","2018-01-05","2018-01-05","2018-01-11","2018-01-11","2018-01-22" )
time <- c("10:38:38","10:47:17", "10:47:09","17:20:31","17:20:24","12:00:54" )


df <-  data.frame(movmnt_id,  plant, loc, qty,date, time)
df

  movmnt_id  plant  loc   qty       date     time
1       101   F5P  CB00   100   2018-01-05   10:38:38
2       101   F5D  CB00   100   2018-01-05   10:47:17
3       351   F5P  CB00   100   2018-01-05   10:47:09
4       601   F5D  CB00    10   2018-01-11   17:20:31
5       601   F5D  CB00    90   2018-01-11   17:20:24
6       351   RUP  MOS1    88   2018-01-22   12:00:54

这是不好的-我失去了以前的订单

我需要的是
movmnt_id=601
的一行,并且与df2中相同的顺序,
movmnt_id=351
日期为2018-01-05,应该在日期相同的移动101之间:

  movmnt_id plant loc   date       time     total_qty
  <fct>     <fct> <fct> <fct>      <fct>        <dbl>
1 101       F5P   CB00  2018-01-05 10:38:38       100
2 351       F5P   CB00  2018-01-05 10:47:09       100
3 101       F5D   CB00  2018-01-05 10:47:17       100
4 601       F5D   CB00  2018-01-11 17:20:24       100
5 351       RUP   MOS1  2018-01-22 12:00:54        88

movmnt\u id工厂定位日期时间总数量
101F5P CB00 2018-01-05 10:38:100
2351 F5P CB00 2018-01-05 10:47:09 100
3 101 F5D CB00 2018-01-05 10:47:17 100
4 601 F5D CB00 2018-01-11 17:20:24100
5351 RUP MOS1 2018-01-22 12:00:54 88
基本上,如果分组条件中的所有值都相同,除了数量-这些行可以求和,但如果不是-则必须保持顺序


如何操作?

要从
df2
维护相同的顺序,您可以创建一个唯一键并
匹配

cols <- c('movmnt_id', 'plant', 'loc', 'date')
df3 <- df3[order(match(do.call(paste, df3[cols]), do.call(paste, df2[cols]))), ]
df3

# movmnt_id plant loc   date       total_qty
#  <chr>     <chr> <chr> <chr>          <dbl>
#1 101       F5P   CB00  2018-01-05       100
#2 351       F5P   CB00  2018-01-05       100
#3 101       F5D   CB00  2018-01-05       100
#4 601       F5D   CB00  2018-01-11       100
#5 351       RUP   MOS1  2018-01-22        88

cols要从
df2
维护相同的顺序,您可以创建一个唯一的键并
匹配

cols <- c('movmnt_id', 'plant', 'loc', 'date')
df3 <- df3[order(match(do.call(paste, df3[cols]), do.call(paste, df2[cols]))), ]
df3

# movmnt_id plant loc   date       total_qty
#  <chr>     <chr> <chr> <chr>          <dbl>
#1 101       F5P   CB00  2018-01-05       100
#2 351       F5P   CB00  2018-01-05       100
#3 101       F5D   CB00  2018-01-05       100
#4 601       F5D   CB00  2018-01-11       100
#5 351       RUP   MOS1  2018-01-22        88

cols隐式地,您希望维护日期变量给定的顺序。在
groupby
参数中首先列出
date
,以确保
summary
命令使用
date
作为主键

df %>%
  group_by(date, movmnt_id, plant, loc) %>%
  summarise(total_qty = sum(qty)) %>%
  ungroup()
#> `summarise()` has grouped output by 'date', 'movmnt_id', 'plant'. You can override using the `.groups` argument.
#> # A tibble: 5 x 5
#>   date       movmnt_id plant loc   total_qty
#>   <chr>      <chr>     <chr> <chr>     <dbl>
#> 1 2018-01-05 101       F5D   CB00        100
#> 2 2018-01-05 101       F5P   CB00        100
#> 3 2018-01-05 351       F5P   CB00        100
#> 4 2018-01-11 601       F5D   CB00        100
#> 5 2018-01-22 351       RUP   MOS1         88
df%>%
分组人(日期、移动id、工厂、loc)%>%
汇总(总数量=总和(数量))%>%
解组()
#>`summary()`已按'date'、'movmnt_id'、'plant'对输出进行分组。可以使用“.groups”参数重写。
#>#tibble:5 x 5
#>日期移动标识工厂loc总数量
#>                    
#>2018-01-05 101 F5D CB00 100
#>2018-01-05 101 F5P CB00 100
#>3 2018-01-05 351 F5P CB00 100
#>4 2018-01-11 601 F5D CB00 100
#>5 2018-01-22 351 RUP MOS1 88

隐式地,您希望维护日期变量给定的顺序。在
groupby
参数中首先列出
date
,以确保
summary
命令使用
date
作为主键

df %>%
  group_by(date, movmnt_id, plant, loc) %>%
  summarise(total_qty = sum(qty)) %>%
  ungroup()
#> `summarise()` has grouped output by 'date', 'movmnt_id', 'plant'. You can override using the `.groups` argument.
#> # A tibble: 5 x 5
#>   date       movmnt_id plant loc   total_qty
#>   <chr>      <chr>     <chr> <chr>     <dbl>
#> 1 2018-01-05 101       F5D   CB00        100
#> 2 2018-01-05 101       F5P   CB00        100
#> 3 2018-01-05 351       F5P   CB00        100
#> 4 2018-01-11 601       F5D   CB00        100
#> 5 2018-01-22 351       RUP   MOS1         88
df%>%
分组人(日期、移动id、工厂、loc)%>%
汇总(总数量=总和(数量))%>%
解组()
#>`summary()`已按'date'、'movmnt_id'、'plant'对输出进行分组。可以使用“.groups”参数重写。
#>#tibble:5 x 5
#>日期移动标识工厂loc总数量
#>                    
#>2018-01-05 101 F5D CB00 100
#>2018-01-05 101 F5P CB00 100
#>3 2018-01-05 351 F5P CB00 100
#>4 2018-01-11 601 F5D CB00 100
#>5 2018-01-22 351 RUP MOS1 88

这里我为id/plant/loc组合按时间顺序制作了一个有序因子,这里称为“键”。然后,当我们按它进行聚合时(快捷方式使用count代替
group\u by%>%summary
),count使用它对输出进行排序

library(forcats)  # alternatively, load with library(tidyverse)
df %>%
  arrange(date, time) %>%
  mutate(key = paste(movmnt_id, plant, loc) %>% as_factor %>% fct_inorder()) %>%
  count(key, date, movmnt_id, plant, loc, wt = qty, name = "total_qty")

           key       date movmnt_id plant  loc total_qty
1 101 F5P CB00 2018-01-05       101   F5P CB00       100
2 351 F5P CB00 2018-01-05       351   F5P CB00       100
3 101 F5D CB00 2018-01-05       101   F5D CB00       100
4 601 F5D CB00 2018-01-11       601   F5D CB00       100
5 351 RUP MOS1 2018-01-22       351   RUP MOS1        88

在这里,我按时间顺序为id/plant/loc组合创建了一个有序因子,这里称为“键”。然后,当我们按它进行聚合时(快捷方式使用count代替
group\u by%>%summary
),count使用它对输出进行排序

library(forcats)  # alternatively, load with library(tidyverse)
df %>%
  arrange(date, time) %>%
  mutate(key = paste(movmnt_id, plant, loc) %>% as_factor %>% fct_inorder()) %>%
  count(key, date, movmnt_id, plant, loc, wt = qty, name = "total_qty")

           key       date movmnt_id plant  loc total_qty
1 101 F5P CB00 2018-01-05       101   F5P CB00       100
2 351 F5P CB00 2018-01-05       351   F5P CB00       100
3 101 F5D CB00 2018-01-05       101   F5D CB00       100
4 601 F5D CB00 2018-01-11       601   F5D CB00       100
5 351 RUP MOS1 2018-01-22       351   RUP MOS1        88

不,这还不够,它不会适用于所有情况。首先按时间戳排列是很重要的。行排序和数据无关,除非您有一个时间序列。否则,聚合数据集将具有非保证的排序,并且仍将保持所需的属性。不,这还不够,它不会适用于所有情况。首先按时间戳排列是很重要的。行排序和数据无关,除非您有一个时间序列。否则,聚合数据集将具有非保证的排序,并且仍将保持所需的属性。几乎,但具有
movmnt_id=351
date=2018-01-05
的行改变了其位置。它与移动101的日期相同,但根据交易历史记录,它们之间必须存在。这就是为什么我先按时间安排。数据集要复杂得多,同一天可能会有大量不同数量的重复交易,因此首先要了解这些交易是否已经一个接一个地完成,然后数量可以在一行中求和,或者在这两行之间有另一个交易-在这种情况下,它必须根据时间顺序进行拆分。几乎,但是带有
movmnt_id=351和
date=2018-01-05的行改变了它的位置。它与移动101的日期相同,但根据交易历史记录,它们之间必须存在。这就是为什么我先按时间安排。数据集要复杂得多,同一天可能有大量不同数量的重复交易,因此,重要的是首先要了解它们是否一个接一个地完成,然后数量可以在一行中求和,或者在这两行之间有另一个交易-在这种情况下,它必须根据时间顺序进行拆分。这很好!谢谢看起来也适用于更大的数据集。我能请你解释一下它是如何工作的吗?我无法理解此代码如何影响行顺序。据我所知,这只会影响列的顺序。这是对行的重新排序。将
df2
中的
cols
中的值组合在一起,将创建一个粘贴的字符串,根据该字符串对
df3
中的行重新排序。为了更好地理解它是如何工作的,我建议在更小的数据集上一步一步地运行它。这很好!谢谢看起来也适用于更大的数据集。我能请你解释一下它是如何工作的吗?我无法理解此代码如何影响行顺序。据我所知,这只会影响列的顺序。这是对行的重新排序。将
df2
中的
cols
中的值组合在一起,将创建一个粘贴的字符串,根据该字符串对
df3
中的行重新排序。到