首页 > 解决方案 > 以两个日期之间的最小差异为条件的数据框子集

问题描述

我有一个包含 4 个变量的数据框:id、measurement、date_a、date_b。

单个 id 可以多次对 df 做出贡献。我想对这个数据框进行子集化,以便每个 id 只包含一个测量值。我想根据 date_b 和 date_a 之间的最小差异为每个 id 选择一行,但是这个最小差异至少需要一年。有没有办法使用 dplyr 使用一行代码来做到这一点,而不是为日期差异创建一个新变量?

标签: rdplyrsubset

解决方案


这里有一些假数据。(最佳做法是在您的问题中包含这样的内容,以避免对您的特定情况产生歧义或误解。)

set.seed(8601)
df <- data.frame(
  id = rep(1:3, each = 5),
  measurement = "foo",
  date_a = as.Date(sample(1:3000, 15), origin = "2010-01-01")
)
df$date_b <- df$date_a + sample(1:1000, 15)

这是使用 dplyr 的一种略长于单行的方法:

library(dplyr)
df %>% group_by(id) %>% filter(date_b-date_a >= 365) %>% filter(date_b-date_a == min(date_b-date_a))

结果:

# A tibble: 3 x 4
# Groups:   id [3]
     id measurement date_a     date_b    
  <int> <fct>       <date>     <date>    
1     1 foo         2013-06-13 2014-11-26
2     2 foo         2014-10-05 2017-04-14
3     3 foo         2012-01-07 2014-02-11

推荐阅读