我有两个df:
ID1 <- c("TRZ00897", "AAR9832", "NZU44447683209", "sxc89898989M", "RSU765th89", "FFF")
Date1 <- c("2022-08-21","2022-03-22","2022-09-24", "2022-09-21", "2022-09-22", "2022-09-22")
Data1 <- data.frame(ID1,Date1)
ID <- c("RSU765th89", "NZU44447683209", "AAR9832", "TRZ00897","ERD895655", "FFF", "IUHG0" )
Date <- c("2022-09-22","2022-09-21", "2022-03-22", "2022-08-21", "2022-09-21", "2022-09-22", "2022-09-22" )
Data2 <- data.frame(ID,Date)我试着得到精确的匹配。一个确切的匹配是,如果ID和日期在两个df中是相同的,例如:"TRZ00897“"2022-08-21”是精确匹配的,因为在两个df中都存在。
使用以下代码行:
match(Data1$ID1, Data2$ID) == match(Data1$Date1, Data2$Date)产出如下:
TRUE TRUE NA NA TRUE FALSE显然,最后一个不应该是错误的,因为"FFF“"2022-09-22”在两个df中。错误的原因是,日期“2022-09-22”已经发生在Data2中的索引位置1。
match(Data1$ID1, Data2$ID)
4 3 2 NA 1 6
match(Data1$Date1, Data2$Date)
4 3 NA 2 1 1因此,在最后有索引位置6和1,这是不相等的-> FALSE。
我怎么才能改变这个?我应该用哪个函数来得到正确的答案。
注意,我不需要合并或加入等等。我真的在寻找一个可以检测这些模式的函数。
发布于 2022-10-26 10:44:29
将列组合在一起,然后匹配
match(paste(Data1$ID1, Data1$Date1), paste(Data2$ID, Data2$Date))
# [1] 4 3 NA NA 1 6若要获得逻辑输出,请使用%in%
paste(Data1$ID1, Data1$Date1) %in% paste(Data2$ID, Data2$Date)
# [1] TRUE TRUE FALSE FALSE TRUE TRUE发布于 2022-10-26 10:44:14
使用mapply和%in%
apply(mapply(`%in%`, Data1, Data2), 1, all)
[1] TRUE TRUE FALSE FALSE TRUE TRUE
rowSums(mapply(`%in%`, Data1, Data2)) == ncol(Data1)编辑;用于列的子集:
idx <- c(1, 2)
apply(mapply(`%in%`, Data1[idx], Data2[idx]), 1, all)
#[1] TRUE TRUE FALSE FALSE TRUE TRUE发布于 2022-10-26 10:49:36
尝试与asplit匹配(由于对两个数据文件有不同的列名,我必须使用unname手动删除名称,如果两者的名称相同,则可以避免)
> match(asplit(unname(Data1), 1), asplit(unname(Data2), 1))
[1] 4 3 NA NA 1 6另一个内存开销较大的选项是使用interaction。
> match(interaction(Data1), interaction(Data2))
[1] 4 3 NA NA 1 6https://stackoverflow.com/questions/74206233
复制相似问题