【发布时间】:2018-04-08 06:41:45
【问题描述】:
我正在尝试根据 ID 和日期将第二个数据集中的信息添加到我的第一个数据集中。如果 ID 匹配并且“日期”介于“开始”和“结束”之间,我想将颜色的值添加到 df1。
df1
ID Date
1 3/31/2017
2 2/11/2016
2 4/10/2016
3 5/15/2015
df2
ID start end colour
1 1/1/2000 3/31/2011 blue
1 4/1/2011 6/4/2012 purple
1 6/5/2012 3/31/2017 blue
2 5/1/2014 3/31/2017 red
3 1/12/2012 2/12/2014 purple
要得到这样的结果:
dat
ID Date colour
1 3/31/2017 blue
2 2/11/2016 red
2 4/10/2016 red
3 5/15/2015 NA
可以用这里的代码创建:
library(lubridate)
df1 <- tibble(ID = c(1,2,2,3), Date = mdy(c("3/31/2017","2/11/2016","4/10/2016","5/15/2015")))
df2 <- tibble(ID = c(1,1,1,2,3), start = mdy(c("1/1/2000","4/1/2011","6/5/2012","5/1/2014","1/12/2012")), end = mdy(c("3/31/2011","6/4/2012","3/31/2017","3/31/2017","2/12/2014")), colour = c("blue", "purple", "blue", "red", "purple"))
我使用了一个类似问题的回答, Checking if Date is Between two Dates in R 并使用以下代码:
library(dplyr)
dat <- inner_join(df1, df2, by = "ID")
dat %>% rowwise() %>%
mutate(match = ifelse(between(df1$Date, df2$start, df2$end), 1 , 0))%>%
select(-c(df2$start, df2$end))%>%
arrange(df1$Date, desc(match))%>%
distinct(df1$Date)
我收到以下错误:
(df1$Date, df2$start, df2$end) 之间的错误: 期望单个值:[extent=355368]。
帮助?
非常感谢!
更新-
非常感谢大家的回答。
我尝试了所有方法,但所有最终数据集的行数都与第一个数据集不同。我不确定发生了什么。我发布的数据是虚构的,类似于我正在使用的数据。我应该让您知道的其他详细信息吗?我不知道从哪里开始...
【问题讨论】:
-
您能否将生成示例数据框所需的代码转储到您的帖子中,以便我们也可以复制和修补该问题?见:meta.stackexchange.com/a/191794/346447 或 stackoverflow.com/q/5963269/5088194
标签: r date inner-join dplyr