繁体   English   中英

在特定条件下,如何用来自其他字段的最大值/最小值替换字段中的值? 允许重复条件

[英]How do you replace values in a field with max/min values from other fields subject to particular conditions? Allowing for duplicated conditions

这是这里上一个问题的扩展: 如何在特定条件下用其他字段的最大值/最小值替换字段中的值? .

鉴于Category1Category2TypeIndexDate ,我想创建一个名为New_Date的新字段,如下所示。 New_Date将是对应于属于Category1Category2的每个组合的最高Index的日期,受另一个字段Type等于 1 的约束。

我的data有 > 100 万条记录和 50 个字段。

注意:与上面链接的其他问题的不同之处在于Index字段可能不是唯一的。 如果它们重复,我们需要返回最新的max(Date)

Category1 <-c (rep("A",8),rep("B",3),rep("C",4))

Category2 <-c (rep("X",5),rep("Y",4),rep("Z",6))

Index <- c(rep(1,8),seq(1:3),seq(1:4))

Date <- c("01/01/2020","01/02/2020","01/03/2020","01/04/2020","01/05/2020","01/06/2020","01/07/2020","29/07/2020","01/01/2014","01/02/2014","01/01/2015","01/01/2014","01/01/2015","01/01/2016","01/01/2017")

Type <- c(1,2,1,2,2,1,2,1,1,2,1,1,2,2,1)
类别1 类别2 指数 日期 类型 新日期
一种 X 1 01/01/2020 1 01/03/2020
一种 X 2 01/02/2020 2 01/05/2020
一种 X 1 01/03/2020 1 01/03/2020
一种 X 4 01/04/2020 2 01/05/2020
一种 X 5 01/05/2020 2 01/05/2020
一种 6 01/06/2020 1 29/07/2020
一种 7 01/07/2020 1 29/07/2020
一种 8 29/07/2020 1 29/07/2020
1 01/01/2014 1 01/01/2014
Z 2 01/02/2014 2 01/01/2015
Z 3 01/01/2015 1 01/01/2015
C Z 1 01/01/2014 1 01/01/2017
C Z 2 01/01/2015 2 01/01/2017
C Z 3 01/01/2016 2 01/01/2017
C Z 4 01/01/2017 1 01/01/2017

按照Ronak Shah 的建议使用下面的代码

setDT(df)[, New_Date := Date[match(max(Index[Type == 1]), Index)], .(Category1, Category2)]

在第三行中, R将与第一次匹配,并且New_Date将是01/01/2020而不是01/03/2020

非常感谢对上述代码的任何建议或轻微改动!

这是使用包data.table解决问题的一种可能方法。

setDT(df)[, New_Date := max(Date[Index==max(Index)]), by=.(Category1, Category2, Type==1)]
 
#     Category1 Category2 Index       Date  Type   New_Date
#  1:         A         X     1 01/01/2020     1 01/03/2020
#  2:         A         X     2 01/02/2020     2 01/05/2020
#  3:         A         X     1 01/03/2020     1 01/03/2020
#  4:         A         X     4 01/04/2020     2 01/05/2020
#  5:         A         X     5 01/05/2020     2 01/05/2020
#  6:         A         Y     6 01/06/2020     1 29/07/2020
#  7:         A         Y     7 01/07/2020     2 01/07/2020
#  8:         A         Y     8 29/07/2020     1 29/07/2020
#  9:         B         Y     1 01/01/2014     1 01/01/2014
# 10:         B         Z     2 01/02/2014     2 01/02/2014
# 11:         B         Z     3 01/01/2015     1 01/01/2015
# 12:         C         Z     1 01/01/2014     1 01/01/2017
# 13:         C         Z     2 01/01/2015     2 01/01/2016
# 14:         C         Z     3 01/01/2016     2 01/01/2016
# 15:         C         Z     4 01/01/2017     1 01/01/2017

这是dplyr方法:

df %>%  
  group_by(Category1, Category2, Type==1) %>% 
  mutate(New_Date = max(Date[Index==max(Index)])) %>% 
  ungroup() %>% 
  select(-`Type == 1`)

如果您乐于使用 Tidyverse,我认为这可以满足您的需求:

df <- tibble::tibble(Category1 = c(rep("A",8),rep("B",3),rep("C",4)),
             Category2 = c(rep("X",5),rep("Y",4),rep("Z",6)),
             Index = c(1,2,1,4,5,6,7,8, seq(1:3), seq(1:4)),
             Date = c("01/01/2020","01/02/2020","01/03/2020","01/04/2020","01/05/2020","01/06/2020","01/07/2020","29/07/2020","01/01/2014","01/02/2014","01/01/2015","01/01/2014","01/01/2015","01/01/2016","01/01/2017"),
             Type = c(1,2,1,2,2,1,2,1,1,2,1,1,2,2,1)

df |>
  dplyr::group_by(Category1, Category2, Index) |>
  dplyr::mutate(new_date = max(Date))

# A tibble: 15 x 6
# Groups:   Category1, Category2, Index [14]
   Category1 Category2 Index Date        Type new_date  
   <chr>     <chr>     <dbl> <chr>      <dbl> <chr>     
 1 A         X             1 01/01/2020     1 01/03/2020
 2 A         X             2 01/02/2020     2 01/02/2020
 3 A         X             1 01/03/2020     1 01/03/2020
 4 A         X             4 01/04/2020     2 01/04/2020
 5 A         X             5 01/05/2020     2 01/05/2020
 6 A         Y             6 01/06/2020     1 01/06/2020
 7 A         Y             7 01/07/2020     2 01/07/2020
 8 A         Y             8 29/07/2020     1 29/07/2020
 9 B         Y             1 01/01/2014     1 01/01/2014
10 B         Z             2 01/02/2014     2 01/02/2014
11 B         Z             3 01/01/2015     1 01/01/2015
12 C         Z             1 01/01/2014     1 01/01/2014
13 C         Z             2 01/01/2015     2 01/01/2015
14 C         Z             3 01/01/2016     2 01/01/2016
15 C         Z             4 01/01/2017     1 01/01/2017
          )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM