首页 > 解决方案 > 如何在R中的某些条件后获得x天

问题描述

我有一个包含多个日期和条件的数据集。我想提取所有以条件 place == "A" 开头的行和所有以 place == "A" 开始日期和最多 7 天后的行。例如:

Date        Place       Value1      Value2
2018-10-27  C           20          8 
2018-10-29  A           10          5
2018-10-31  B           15          6
2018-11-4   C           17          9 
2018-11-8   D           18          5  

而且我要:

Date        Place       Value1      Value2
2018-10-29  A           10          5
2018-10-31  B           15          6
2018-11-4   C           17          9 

如您所见,它必须在 7 天内提取具有 place == A 的第一行和所有行。第一天之后的地方像“A”没有意义,像“B”和“C”。它必须以“A”开头。它会跳过 2018-11-8,因为它距离 2018-10-29 超过 7 天。

我试过这样的问题:R: Extract data based on date, "if date less than",但我不知道如何提取 7 天。

标签: rdateextract

解决方案


我们可以使用它match来获取相应Date的值并从中选择 7 天内的所有行。

library(dplyr)

df %>%
  mutate(Date = as.Date(Date)) %>%
  filter({tmp <- Date[match('A', Place)] 
          between(Date, tmp, tmp + 7)})

#        Date Place Value Value.1
#1 2018-10-29     A    10       5
#2 2018-10-31     B    15       6
#3 2018-11-04     C    17       9

dplyr允许在全局环境中不创建临时变量的情况下执行操作,上述解决方案可以用基础 R 编写为:

df$Date <- as.Date(df$Date)
date_val <- df$Date[match('A', df$Place)]
subset(df, Date >= date_val & Date <= date_val + 7)

数据

df <- structure(list(Date = structure(c(17831, 17833, 17835, 17839, 
17843), class = "Date"), Place = c("C", "A", "B", "C", "D"), 
    Value = c(20L, 10L, 15L, 17L, 18L), Value.1 = c(8L, 5L, 6L, 
    9L, 5L)), row.names = c(NA, -5L), class = "data.frame")

推荐阅读