【问题标题】:compare adjacent rows in R比较R中的相邻行
【发布时间】:2019-10-09 11:08:40
【问题描述】:

在我的数据框中,我有一列“日期”,我希望 R 在循环中遍历每一行日期,以查看它之前或之后的日期是否在 3-14 天范围内,如果不是,它被索引到一个要在循环结束时删除的列表。

例如:

my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")

我想删除包含 2/20/2019 的整行,因为在该日期的 3-14 天内没有其他日期。

任何帮助将不胜感激!

【问题讨论】:

    标签: r loops date comparison row


    【解决方案1】:

    使用一点ordering 和diffing:

    my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")
    my_dates <- as.Date(my_dates, format="%m/%d/%Y")
    
    o <- order(my_dates)
    d <- abs(diff(my_dates[o]))
    
    my_dates[o[ c(Inf,d) <= 14 | c(d,Inf) <= 14 ]]
    #[1] "2019-01-04" "2019-01-18" "2019-04-03" "2019-04-05"
    

    【讨论】:

    • 谢谢!这很有意义。我忘了提到我也有兴趣按组做这件事。我有一个“Patient_ID”组,我希望 R 提取不在 14 天范围内的日期,但前提是它是同一位患者。例如,如果有两个日期,但 2019 年 1 月 20 日属于患者 A,而 2019 年 1 月 24 日属于患者 B,我希望 R 忽略它。我有以下代码:df&lt;-data.table(data_2011_2018$Patient_ID,data_2011_2018$Date_of_Collection) z = df[ , baseline := Date_of_Collection - shift(Date_of_Collection), by = Patient_ID]
    • @steph.zank - 这可能是一个建立在这个问题上的单独问题。理想情况下,您需要再次发布您的data.table 的简单示例(以可复制的形式),并将此问题作为资源指出。从您的描述来看应该不会太难,但是使用新问题/数据会更容易。由于您也在使用data.table,因此可能有完全不同的方法可以更好地扩展到分组。
    【解决方案2】:

    这是使用lubridate 和dplyr 的详细方法。

    my_dates <- c( "1/4/2019", "1/18/2019", "4/3/2019", "2/20/2019", "4/5/2019")
    
    library(lubridate); library(dplyr)
    df <- data.frame(dates = mdy(my_dates)) %>%
      arrange(dates) %>%
      mutate(days_prior  = dates - lag(dates),
             days_before = lead(dates) - dates) %>%
      mutate(closest_day = pmin(days_prior, days_before, na.rm = T)) %>%
      filter(closest_day <= 14)
    

    【讨论】:

    • 不是应该在 3 到 14 天之间,而不是小于 14 天吗?
    • 我不确定如何解释“3-14 天内”,因为可以说 1-2 天是“在”范围内,也就是小于该范围。如果你想剪掉当天最近或最多两天的东西,我们只需更改为filter(closest_day &gt;= 3, closest_day &lt;=14)。
    【解决方案3】:

    这是来自outer 的一种方式,来自thelatemail 的数据

    s=abs(-outer(my_dates, my_dates, '-'))
    my_dates[rowSums(s<=14)>1]
    [1] "2019-01-04" "2019-01-18" "2019-04-03" "2019-04-05"
    

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多