R 是否可以基于多种条件进行合并?

R 是否可以基于多种条件进行合并?,r,dataframe,merge,R,Dataframe,Merge,我想要实现的是能够基于日期比较数据,如果日期介于范围之间,则取最低的“PDF2”值 这是我正在使用的两个数据帧的一个示例。我想检查“df”中“R”列的数据是否在“df2”的“R”列中找到。检查日期是否在df2的范围内,如果有任何冲突或重复,我想始终保持“PDF2”的最低值 df我想这个问题的答案可能会帮助你: df%>% 左联合(df2,by=“R”)%>% 过滤器(lubridate::dmy(D)>=lubridate::dmy(DD)&lubridate::dmy(D)% 按(R,D)%

我想要实现的是能够基于日期比较数据,如果日期介于范围之间,则取最低的“PDF2”值

这是我正在使用的两个数据帧的一个示例。我想检查“df”中“R”列的数据是否在“df2”的“R”列中找到。检查日期是否在df2的范围内,如果有任何冲突或重复,我想始终保持“PDF2”的最低值


df我想这个问题的答案可能会帮助你:

df%>%
左联合(df2,by=“R”)%>%
过滤器(lubridate::dmy(D)>=lubridate::dmy(DD)&lubridate::dmy(D)%
按(R,D)%>%
过滤器(PDF2==min(PDF2))%>%
解组()

如果您想要非常高效的东西,可以使用
data.table
包。下面的代码可以满足您的要求

library(data.table)

setDT(df, key="R")
setDT(df2, key="R")

df[, D:=as.Date(D, format = "%d/%m/%Y")]
df2[, `:=`(
  DD = as.Date(DD, format = "%d/%m/%Y"),
  DF = as.Date(DF, format = "%d/%m/%Y")
)]

df[df2][D>=DD & D<=DF][, .(DD=max(DD), DF=max(DF), PDF2=PDF2[which.max(DD)]), .(D, R, PDF)]
##              D      R  PDF         DD         DF PDF2
##  1: 2019-01-01 ABC123 1.23 2019-01-01 2019-02-01 1.12
##  2: 2019-02-01 ABC123 1.23 2019-02-01 2019-03-01 1.11
##  3: 2019-03-01 ABC123 1.23 2019-02-01 2019-03-01 1.11
库(data.table)
setDT(df,key=“R”)
setDT(df2,key=“R”)
df[,D:=as.Date(D,format=“%D/%m/%Y”)]
df2[,`:=`(
DD=截止日期(DD,格式=“%d/%m/%Y”),
DF=as.Date(DF,format=“%d/%m/%Y”)
)]

df[df2][D>=DD&D感谢您的回答,但我的数据帧实际上与我显示的数据帧不同,因此我是否只需要通过()更改组_或者,为了使您的解决方案更好地工作,还有其他事情需要更改吗?因为当我运行您的代码并调整当前数据帧的名称时,我收到以下警告:警告消息:1:所有格式都无法解析。未找到任何格式。2:所有格式都无法解析。未找到任何格式。这可能是由于
lubr解析日期格式造成的idate
.Wat格式是您的日期吗?
lubridate::dmy
采用“d-m-y”(例如2019年1月1日)格式。我的日期格式正确,只是我的列名有空格,我先放了这个“”,但后来意识到我不得不用这个“`”。
result <- data.frame("R" = c("ABC123", "ABC123", "ABC123"),
                 "D" = c("01/01/2019", "01/02/2019", "01/03/2019"),
                 "DD" = c("01/01/2019", "01/02/2019", "01/02/2019"),
                 "DF" = c("01/02/2019", "01/03/2019", "01/03/2019"),
                 "PDF" = c(1.23, 1.23, 1.23),
                 "PDF2" = c(1.12, 1.11, 1.11),
                 stringsAsFactors = FALSE)
temp <- merge(df, df2, by = "R")
myd <- which(as.Date(temp$D, format = "%d/%m/%Y") <= as.Date(temp$DF, format = "%d/%m/%Y"))
myd2 <- which(as.Date(temp$D, format = "%d/%m/%Y") >= as.Date(temp$DD, format = "%d/%m/%Y"))
myd <- myd[myd %in% myd2]
if (length(myd)) {
  temp <- temp[myd,]
}
df %>% 
  left_join(df2, by = "R") %>% 
  filter(lubridate::dmy(D) >= lubridate::dmy(DD) & lubridate::dmy(D) <= lubridate::dmy(DF)) %>% 
  group_by(R,D) %>% 
  filter(PDF2 == min(PDF2)) %>% 
  ungroup()
library(data.table)

setDT(df, key="R")
setDT(df2, key="R")

df[, D:=as.Date(D, format = "%d/%m/%Y")]
df2[, `:=`(
  DD = as.Date(DD, format = "%d/%m/%Y"),
  DF = as.Date(DF, format = "%d/%m/%Y")
)]

df[df2][D>=DD & D<=DF][, .(DD=max(DD), DF=max(DF), PDF2=PDF2[which.max(DD)]), .(D, R, PDF)]
##              D      R  PDF         DD         DF PDF2
##  1: 2019-01-01 ABC123 1.23 2019-01-01 2019-02-01 1.12
##  2: 2019-02-01 ABC123 1.23 2019-02-01 2019-03-01 1.11
##  3: 2019-03-01 ABC123 1.23 2019-02-01 2019-03-01 1.11