r - 识别最近的日期时间
问题描述
我在需要生成的逻辑方面遇到了一些麻烦df$val_most_recent
。如果 和 都有值a_val
,b_val
则val_most_recent
应该是最近时间的值(a_val
对应于a_dtm
,b_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
解决方案
这是 中的一个选项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
推荐阅读
- xamarin.forms - 更新到 .forms 3.1 后更改了操作栏和页面的背景颜色
- apache-spark - Google Cloud、集群或无集群上的 Apache Spark
- java - 将 JCo 项目部署到 SCP 时出错
- html - flexbox中的元素和图像定位
- android - 是否可以在 web3j 中对消息(字符串)进行签名/加密,然后使用公钥(地址)解密消息
- c# - (已关闭)C# 控制台自动完成/建议输入,代码改进
- java - JAVA - SQL 服务器将字符串值插入 varbinary(max) 数据类型
- reactjs - 在 IIS 10 上创建反应应用程序
- ruby - 'group_by' 使用的 Ruby 比较
- xpages - 在服务器端处理时从扩展库显示对话框