【发布时间】:2021-10-02 04:54:26
【问题描述】:
这是对上一个问题的扩展:How do you replace values in a field with max/min values from other fields subject to particular conditions?。
鉴于Category1、Category2、Type、Index 和Date,我想创建一个名为New_Date 的新字段,如下所示。 New_Date 将是与属于Category1 和Category2 的每个组合的最高Index 对应的日期,另一个字段Type 等于1。
我的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)
| Category1 | Category2 | Index | Date | Type | New_Date |
|---|---|---|---|---|---|
| A | X | 1 | 01/01/2020 | 1 | 01/03/2020 |
| A | X | 2 | 01/02/2020 | 2 | 01/05/2020 |
| A | X | 1 | 01/03/2020 | 1 | 01/03/2020 |
| A | X | 4 | 01/04/2020 | 2 | 01/05/2020 |
| A | X | 5 | 01/05/2020 | 2 | 01/05/2020 |
| A | Y | 6 | 01/06/2020 | 1 | 29/07/2020 |
| A | Y | 7 | 01/07/2020 | 1 | 29/07/2020 |
| A | Y | 8 | 29/07/2020 | 1 | 29/07/2020 |
| B | Y | 1 | 01/01/2014 | 1 | 01/01/2014 |
| B | Z | 2 | 01/02/2014 | 2 | 01/01/2015 |
| B | 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。
非常感谢对上述代码的任何建议或细微改动!
【问题讨论】:
-
new_date 的第 1 行和第 3 行是否相同?即第 1 行中的 new_date 应该是 01/01/2020 还是 01/03/2020?
-
获得预期输出的逻辑有点不清楚。您能否确认
new_Date是否针对预期输出表中最后一行之前的两行正确计算?值不应该是01/01/2016而不是01/01/2017 -
问题可能是第 3 行中的“索引”应该是“3”而不是“1”,
Index<-c(rep(1,8),seq(1:3),seq(1:4))应该是Index<-c(seq(1,8), seq(1:3), seq(1:4)) -
Eeeek。我很抱歉@Tech Commodities,你说得很对,我使用的代码 sn-p 不正确。应该是
Index<-c(1,2,1,4,5,6,7,8, seq(1:3), seq(1:4))。基本上它是先前链接问题的副本,但在第 3 行稍作调整以显示索引字段可以复制。是的,第 1 行和第 3 行的 New_Date 应该是 01/03/2020 是正确的,这就是意图。 @B.ChristianKamgang,是的,你是对的,底行之前的前两行应该是 01/01/2016。道歉
标签: r dataframe data.table