【问题标题】:How to return a value of a column that is associated with the max(date) in R?如何返回与 R 中的最大(日期)关联的列的值?
【发布时间】:2022-12-09 02:31:11
【问题描述】:
我正在寻找一个答案,以找到与最大日期相关联的值,该最大日期也与 R 中的 id 值相关联。数据框看起来像
| id |
value |
date |
| 1 |
A |
12/12/2021 |
| 1 |
B |
12/13/2021 |
| 1 |
A |
12/14/2021 |
| 2 |
A |
12/13/2021 |
| 2 |
C |
12/07/2021 |
| 2 |
B |
12/17/2021 |
| 3 |
C |
12/13/2021 |
| 3 |
B |
12/06/2021 |
| 3 |
C |
12/02/2021 |
代码应返回:
| id |
value |
date |
max_value |
| 1 |
A |
12/12/2021 |
A |
| 1 |
B |
12/13/2021 |
A |
| 1 |
A |
12/14/2021 |
A |
| 2 |
A |
12/13/2021 |
B |
| 2 |
C |
12/07/2021 |
B |
| 2 |
B |
12/17/2021 |
B |
| 3 |
C |
12/13/2021 |
C |
| 3 |
B |
12/06/2021 |
C |
| 3 |
C |
12/02/2021 |
C |
我尝试了以下并收到错误。
df <- df[!is.na(df$date),]
for(ID in unique(df$id)){
as.data.frame(df %>% filter(id == ID) %>% dplyr::mutate(max_value = ifelse(df$date == max(df$date, na.rm = T), df$value, df$value[df$date == max(df$date, na.rm = T) & df$id == ID])))
}
【问题讨论】:
标签:
r
dataframe
datetime
dplyr
filter
【解决方案1】:
尝试以下dplyr 方法:
xx %>% group_by(id) %>%
mutate(max = value[date == max(date)])
输出:
# id value date max
# <int> <chr> <chr> <chr>
# 1 1 A 12/12/2021 A
# 2 1 B 12/13/2021 A
# 3 1 A 12/14/2021 A
# 4 2 A 12/13/2021 B
# 5 2 C 12/07/2021 B
# 6 2 B 12/17/2021 B
# 7 3 C 12/13/2021 C
# 8 3 B 12/06/2021 C
# 9 3 C 12/02/2021 C
【解决方案2】:
找到每个最大值的一种可能解决方案ID在数据框中是使用dplyr包和通过...分组和变异功能。这通过...分组函数按以下方式对数据框进行分组ID专栏,以及变异函数创建一个新列最大值包含每个组的最大值。
library(dplyr)
df <- df %>%
group_by(id) %>%
mutate(max_value = value[which.max(date)])
或者,您可以使用数据表包和经过和[.SD, which.max]功能。这经过函数按以下方式对数据帧进行分组ID专栏,以及[.SD, which.max]函数查找每个组中最大日期的索引。然后,使用放功能,您可以创建一个新列最大值其中包含每个索引的相应值。
library(data.table)
df <- setDT(df)[, max_value := value[.SD, which.max], by = id]
运行上述任一代码后,生成的数据帧应具有所需的输出。