【问题标题】:Subsetting a dataframe conditional on minimum difference between 2 dates以两个日期之间的最小差异为条件的数据框子集
【发布时间】:2019-10-11 22:16:57
【问题描述】:

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

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

【问题讨论】:

  • 这样对吗:显示每个 id 的单行,日期差最小,至少为一年?您是在寻找绝对日期差异还是 date_a 总是排在第一位?如果没有超过一年的差异,我们应该显示零行吗?
  • 嗨,乔恩,是的,我想为每个 id 显示一行,其日期差异最小,至少为一年。日期差将始终为 date_b 减去 date_a。如果对于特定 id 没有最小差异大于一年的行,则应从新数据框中删除所有行。

标签: r dplyr subset


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多