首页 > 解决方案 > 识别最近的日期时间

问题描述

我在需要生成的逻辑方面遇到了一些麻烦df$val_most_recent。如果 和 都有值a_valb_valval_most_recent应该是最近时间的值(a_val对应于a_dtmb_val对应于b_dtm)。a_val如果时间相同,我愿意val_most_recent。如果只为这两个报告一个值(另一个是 a NA,它应该只是那个值。

library(tidyverse)
library(lubridate)

location <- c("a", "b", "c", "d")
a_dtm <- ymd_hm(c(NA, "2019-06-05 10:30", "2019-06-05 10:45", "2019-06-05 10:50"))
b_dtm <- ymd_hm(c("2019-06-05 10:30", NA,  "2019-06-05 10:48", "2019-06-05 10:50"))
a_val <- c(NA, 6, 4, 2)
b_val <- c(5, NA, 3, 2)

df <- data.frame(location, a_dtm, b_dtm, a_val, b_val)

as_tibble(df)
# A tibble: 4 x 5
#location a_dtm               b_dtm               a_val b_val
#<fct>    <dttm>              <dttm>              <dbl> <dbl>
#1 a        NA                  2019-06-05 10:30:00    NA     5
#2 b        2019-06-05 10:30:00 NA                      6    NA
#3 c        2019-06-05 10:45:00 2019-06-05 10:48:00     4     3
#4 d        2019-06-05 10:50:00 2019-06-05 10:50:00     2     2

val_most_recent <- c(5,6,3,2)
desired_df <- cbind(df, val_most_recent)
as_tibble(desired_df)

#location a_dtm               b_dtm                  a_val    b_val val_most_recent
#<fct>    <dttm>              <dttm>                 <dbl>   <dbl>      <dbl>
#1 a        NA                  2019-06-05 10:30:00    NA     5           5
#2 b        2019-06-05 10:30:00 NA                      6    NA           6
#3 c        2019-06-05 10:45:00 2019-06-05 10:48:00     4     3           3
#4 d        2019-06-05 10:50:00 2019-06-05 10:50:00     2     2           2

标签: rlubridate

解决方案


这是 中的一个选项base R,将日期转换为数字,将 替换为NAs0,使用每行中的最大值获取列索引,cbind使用行索引并从 'a_val/b_val' 列中提取相应的值

m1 <- sapply(df[2:3], as.numeric)
df$val_most_recent <- df[4:5][cbind(seq_len(nrow(m1)), 
         max.col(replace(m1, is.na(m1), 0), "first"))]
df$val_most_recent
#[1] 5 6 3 2

推荐阅读