首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不合并的情况下匹配多列?

如何在不合并的情况下匹配多列?
EN

Stack Overflow用户
提问于 2022-10-26 10:27:56
回答 3查看 42关注 0票数 2

我有两个df:

代码语言:javascript
复制
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中都存在。

使用以下代码行:

代码语言:javascript
复制
match(Data1$ID1, Data2$ID) == match(Data1$Date1, Data2$Date)

产出如下:

代码语言:javascript
复制
TRUE  TRUE    NA    NA  TRUE FALSE

显然,最后一个不应该是错误的,因为"FFF“"2022-09-22”在两个df中。错误的原因是,日期“2022-09-22”已经发生在Data2中的索引位置1。

代码语言:javascript
复制
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。

我怎么才能改变这个?我应该用哪个函数来得到正确的答案。

注意,我不需要合并或加入等等。我真的在寻找一个可以检测这些模式的函数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-26 10:44:29

将列组合在一起,然后匹配

代码语言:javascript
复制
match(paste(Data1$ID1, Data1$Date1), paste(Data2$ID, Data2$Date))
# [1]  4  3 NA NA  1  6

若要获得逻辑输出,请使用%in%

代码语言:javascript
复制
paste(Data1$ID1, Data1$Date1) %in% paste(Data2$ID, Data2$Date)
# [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE
票数 3
EN

Stack Overflow用户

发布于 2022-10-26 10:44:14

使用mapply%in%

代码语言:javascript
复制
apply(mapply(`%in%`, Data1, Data2), 1, all)
[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE

rowSums(mapply(`%in%`, Data1, Data2)) == ncol(Data1)

编辑;用于列的子集:

代码语言:javascript
复制
idx <- c(1, 2)
apply(mapply(`%in%`, Data1[idx], Data2[idx]), 1, all)
#[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE
票数 2
EN

Stack Overflow用户

发布于 2022-10-26 10:49:36

尝试与asplit匹配(由于对两个数据文件有不同的列名,我必须使用unname手动删除名称,如果两者的名称相同,则可以避免)

代码语言:javascript
复制
> match(asplit(unname(Data1), 1), asplit(unname(Data2), 1))
[1]  4  3 NA NA  1  6

另一个内存开销较大的选项是使用interaction

代码语言:javascript
复制
> match(interaction(Data1), interaction(Data2))
[1]  4  3 NA NA  1  6
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74206233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档