我提到了两个datafram:
DF_1
ID Date1 Count
1 12/01/2017 7
2 15/02/2017 0
3 18/03/2017 -4
DF_2
if (v[i]<=v[i+1];break)
我想计算DF_1中特定ID与DF_2中相同ID的日期之间的差异,DF_2中最近的旧日期与DF_1的日期进行比较。
例如:对于ID = 1,DF_1的日期是12-01-2017,而DF_2中的最近旧日期将是05-01-2017,因为15&amp; 18都是&gt;比DF_1日期。
必需输出:
break
答案 0 :(得分:0)
以下内容将再现您的预期输出:
library(tidyverse);
df1 <- read.table(text =
"ID Date1
1 12/01/2017
2 15/02/2017
3 18/03/2017", header = T) %>%
mutate(Date1 = as.Date(Date1, format = "%d/%m/%Y"));
df2 <- read.table(text =
"ID Date1
1 05/01/2017
1 15/01/2017
1 18/01/2017
2 10/02/2017
2 13/02/2017
2 15/02/2017
3 22/03/2017", header = T) %>%
mutate(Date1 = as.Date(Date1, format = "%d/%m/%Y"));
left_join(df1, df2, by = "ID") %>%
mutate(Count = Date1.x - Date1.y) %>%
group_by(ID) %>%
slice(ifelse(
all(Count < 0),
which.min(abs(Count)),
which.min(Count[Count >= 0]))) %>%
select(ID, Date1.x, Count)
## A tibble: 3 x 3
## Groups: ID [3]
# ID Date1.x Count
# <int> <date> <time>
#1 1 2017-01-12 7
#2 2 2017-02-15 0
#3 3 2017-03-18 -4
说明:计算df1$Date1
和df2$Date2
之间的时差,按ID
分组,并且只保留具有最小正时差的行,除非所有时差都为负在这种情况下报告最小的绝对时间差。
答案 1 :(得分:0)
我认为您的最后一行是错误的,因为ID=3
df2
值不在df1
值之前。假设这是正确的,你可以这样做......
df3 <- df2 %>% rename(Date2=Date1) %>%
left_join(df1) %>%
mutate(datediff=as.Date(Date1,format="%d/%m/%Y")-as.Date(Date2,format="%d/%m/%Y")) %>%
filter(datediff>=0) %>%
group_by(ID) %>%
summarise(Date1=first(Date1),Count=min(datediff))
df3
ID Date1 Count
1 1 12/01/2017 7
2 2 15/02/2017 0