我在逻辑上遇到了一些麻烦,需要产生df$val_most_recent
。如果同时存在a_val
和b_val
的值,则val_most_recent
应该是最近时间的值(a_val
对应于a_dtm
,{{1} }对应于b_val
)。如果时间相同,我希望b_dtm
为a_val
。如果仅报告了两个的一个值(另一个是val_most_recent
,则该值应该就是那个。
NA
答案 0 :(得分:1)
这里是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
答案 1 :(得分:1)
以下是将您的文本编码成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