r - 如何用受特定条件限制的其他字段的最大值/最小值替换字段中的值?允许重复条件
问题描述
这是此处先前问题的扩展:如何将字段中的值替换为受特定条件限制的其他字段的最大值/最小值?.
给定Category1
、Category2
、和Type
,我想创建一个新字段,如下所示。将是与属于另一个字段的每个组合的最高值对应的日期,并且服从另一个字段等于 1。Index
Date
New_Date
New_Date
Index
Category1
Category2
Type
我data
有超过 1m 的记录和 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 | 2020 年 1 月 1 日 | 1 | 2020 年 1 月 3 日 |
一个 | X | 2 | 2020 年 1 月 2 日 | 2 | 2020 年 1 月 5 日 |
一个 | X | 1 | 2020 年 1 月 3 日 | 1 | 2020 年 1 月 3 日 |
一个 | X | 4 | 2020 年 1 月 4 日 | 2 | 2020 年 1 月 5 日 |
一个 | X | 5 | 2020 年 1 月 5 日 | 2 | 2020 年 1 月 5 日 |
一个 | 是的 | 6 | 2020 年 1 月 6 日 | 1 | 2020 年 7 月 29 日 |
一个 | 是的 | 7 | 2020 年 1 月 7 日 | 1 | 2020 年 7 月 29 日 |
一个 | 是的 | 8 | 2020 年 7 月 29 日 | 1 | 2020 年 7 月 29 日 |
乙 | 是的 | 1 | 2014 年 1 月 1 日 | 1 | 2014 年 1 月 1 日 |
乙 | Z | 2 | 2014 年 1 月 2 日 | 2 | 2015 年 1 月 1 日 |
乙 | Z | 3 | 2015 年 1 月 1 日 | 1 | 2015 年 1 月 1 日 |
C | Z | 1 | 2014 年 1 月 1 日 | 1 | 2017 年 1 月 1 日 |
C | Z | 2 | 2015 年 1 月 1 日 | 2 | 2017 年 1 月 1 日 |
C | Z | 3 | 2016 年 1 月 1 日 | 2 | 2017 年 1 月 1 日 |
C | Z | 4 | 2017 年 1 月 1 日 | 1 | 2017 年 1 月 1 日 |
按照Ronak Shah的建议使用以下代码
setDT(df)[, New_Date := Date[match(max(Index[Type == 1]), Index)], .(Category1, Category2)]
在第三行中,R
将与第一个匹配项匹配,并且New_Date
将01/01/2020
代替01/03/2020
.
非常感谢对上述代码的任何建议或细微改动!
解决方案
这是使用 package 解决问题的一种可能方法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`)
推荐阅读
- reactjs - 具有循环连接的层次树
- java - 如何在我的单元测试中使用 Mockito 或任何 Mocking 框架来模拟 Guice 注入?
- firebase - 如何使用firebase云功能pubsub.schedule?
- javascript - 如何用正则表达式排除特定数字?
- sql - 无论如何通过hive(HQL)将行值转换为列键?
- angular - 如何在 Angular 材料数据表中应用多个过滤器?
- node.js - mongodb聚合排序不按降序排序
- swift - swift中方法“replacingOccurrences(of:with:)”的运行时复杂度是多少
- python - 在 PyTorch 中复制子张量
- c# - 为什么我在这里收到 InvalidCastException?