R:根据条件来自数据帧的子集行

问题描述 投票:0回答:2

假设我有df1:

Start_Date    End_Date     Value
2001-01-01    2001-12-31   1
2002-01-01    2002-12-31   2
2003-01-01    2003-12-31   3
2004-01-01    2004-12-31   4
2005-01-01    2005-12-31   5 

&df2:

DateTime
2003-01-01
2003-05-09
2004-12-31
2005-01-31
2005-08-13

我想通过检查df2中的哪个DateTime介于df1的Start_Date和End_Date之间,将值从df1导入df2。预期结果的观点:

DateTime      Value
2003-01-01    3
2003-05-09    3
2004-12-31    4
2005-01-31    5
2005-08-13    5

请告知

r datetime dplyr subset
2个回答
0
投票

使用dplyrlubridate给出解决方案。

开始之前,请确保所有日期的格式都相同:

df1 <- df1 %>%
  mutate(Start_Date=ymd(Start_Date), End_Date=dmy(End_Date))

df2 <- df2 %>%
  mutate(DateTime=ymd(DateTime))

在您的情况下,只需要列End_Date

首先我交叉连接两个data.frame,因为我看不到将两个df组合在一起的简单解决方案。

df3 <- merge(df1, df2, all=TRUE)

下一步使用filterbetween

df3 %>% 
  filter(between(DateTime, Start_Date, End_Date)) %>%
  select(-c(Start_Date, End_Date))

给予

  Value   DateTime
1     3 2003-01-01
2     3 2003-05-09
3     4 2004-12-31
4     5 2005-01-31
5     5 2005-08-13

使用软件包data.table的另一个选项

setDT(df1)
setDT(df2)
df1[df2, on = .(Start_Date <= DateTime, End_Date >= DateTime), 
    .(DateTime, Value)]

产量

     DateTime Value
1: 2003-01-01     3
2: 2003-05-09     3
3: 2004-12-31     4
4: 2005-01-31     5
5: 2005-08-13     5

0
投票

附加选项。使用lubridate,您可以查看日期是什么间隔

library(tidyverse)
df2 %>% 
  rowwise() %>% 
  mutate(out = df1$Value[(DateTime %within% interval(df1$Start_Date, df1$End_Date))])
© www.soinside.com 2019 - 2024. All rights reserved.