определение самой последней даты и времени - PullRequest
0 голосов
/ 05 июня 2019

У меня возникли проблемы с логикой, которую мне нужно произвести df$val_most_recent. Если есть значения для a_val и b_val, val_most_recent должно быть значением с самым последним временем (a_val соответствует a_dtm, b_val соответствует b_dtm). Если времена совпадают, я бы хотел, чтобы a_val было val_most_recent. Если сообщается только одно значение для двух (другое значение равно 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

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Вот логика из вашего текста, закодированная в оператор case_when:

df %>%
  mutate(
    val_most_recent = case_when(
      is.na(a_val) | is.na(b_va) ~ coalesce(a_val, b_val),
      a_dtm >= b_dtm ~ a_val,
      TRUE ~ b_val
    )
  )
#   location               a_dtm               b_dtm a_val b_val val_most_recent
# 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
1 голос
/ 05 июня 2019

Вот один вариант в base R, преобразовать даты в числовые, заменить NAs на 0, получить индекс столбца с максимальными значениями в каждой строке, 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
...