如何用其他字段的 max/min 值替换字段中的值?

How do you replace values in a field with max/min values from other fields?

鉴于类别索引日期,我想创建一个新字段调用 New_Date 如下。 New_Date 将是 Date 对应于属于同一 Category 的最高索引对于每条记录。

我的数据框有超过 100 万条记录和 50 个字段,所以希望有比 for 循环更有效的解决方案。

我在 SO 上找过类似的问题,但大多数问题都涉及删除不相关的记录,但是我想保留所有记录而不删除任何内容。

非常感谢任何想法!

Category<-c(rep("A",8),rep("B",3),rep("C",4))
Index<-c(seq(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")
类别 索引 日期 New_Date
一个 1 2020 年 1 月 1 日 2020/07/29
一个 2 2020 年 1 月 2 日 2020/07/29
一个 3 2020 年 1 月 3 日 2020/07/29
一个 4 2020 年 1 月 4 日 2020/07/29
一个 5 2020 年 1 月 5 日 2020/07/29
一个 6 2020 年 1 月 6 日 2020/07/29
一个 7 2020 年 1 月 7 日 2020/07/29
一个 8 2020/07/29 2020/07/29
B 1 2014 年 1 月 1 日 2015 年 1 月 1 日
B 2 2014 年 1 月 2 日 2015 年 1 月 1 日
B 3 2015 年 1 月 1 日 2015 年 1 月 1 日
C 1 2014 年 1 月 1 日 2017 年 1 月 1 日
C 2 2015 年 1 月 1 日 2017 年 1 月 1 日
C 3 2016 年 1 月 1 日 2017 年 1 月 1 日
C 4 2017 年 1 月 1 日 2017 年 1 月 1 日

此致, 阿尔奇

试试这个

df <- data.frame(Category, Index, Date)

for (i in 1:nrow(df)){
  df$new_date[i] <- df$Date[which.max(as.Date(df$Date[df$Category == df$Category[i]], format = '%d/%m/%Y')) + 
                              which.max(df$Category == df$Category[i]) - 1]
}

tidyverse 做事的风格。如果您的索引在类别中不重复,实际上 last 不需要换行。

library(tidyverse)

data.frame(Category, Index, Date) %>%
  group_by(Category) %>%
  mutate(newDate = last(Date[Index == max(Index)]))

#> # A tibble: 15 x 4
#> # Groups:   Category [3]
#>    Category Index Date       newDate   
#>    <chr>    <int> <chr>      <chr>     
#>  1 A            1 01/01/2020 29/07/2020
#>  2 A            2 01/02/2020 29/07/2020
#>  3 A            3 01/03/2020 29/07/2020
#>  4 A            4 01/04/2020 29/07/2020
#>  5 A            5 01/05/2020 29/07/2020
#>  6 A            6 01/06/2020 29/07/2020
#>  7 A            7 01/07/2020 29/07/2020
#>  8 A            8 29/07/2020 29/07/2020
#>  9 B            1 01/01/2014 01/01/2015
#> 10 B            2 01/02/2014 01/01/2015
#> 11 B            3 01/01/2015 01/01/2015
#> 12 C            1 01/01/2014 01/01/2017
#> 13 C            2 01/01/2015 01/01/2017
#> 14 C            3 01/01/2016 01/01/2017
#> 15 C            4 01/01/2017 01/01/2017

reprex package (v2.0.0)

于 2021 年 6 月 11 日创建

一个data.table选项-

library(data.table)

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