如何用其他字段的 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
鉴于类别、索引和日期,我想创建一个新字段调用 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