
[英]How do you replace values in a field with max/min values from other fields?
[英]How do you replace values in a field with max/min values from other fields subject to particular conditions? Allowing for duplicated conditions
这是这里上一个问题的扩展: 如何在特定条件下用其他字段的最大值/最小值替换字段中的值? .
鉴于Category1
, Category2
, Type
, Index
和Date
,我想创建一个名为New_Date
的新字段,如下所示。 New_Date
将是对应于属于Category1
和Category2
的每个组合的最高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.