簡體   English   中英

如何檢查一個數據框中的兩列是否都匹配另一個數據框中的兩列?

[英]How can I check that two columns in one dataframe both match two columns in another dataframe?

我有一個這樣的數據框A:

name <- c("John", "Bill", "Amy", "Bill", "Mia") 
Present.ID <- c(12345, 678910, 12345, 8090100, 246810) 
A <- as.data.frame(cbind(name, Present.ID))

一個像這樣的數據框B:

name <- c("John", "Bill", "Amy", "Bill", "Mia") 
Applied.ID <- c(12345, 678910, 12345, 8090100, NA) 
B <- as.data.frame(cbind(name, Applied.ID))

我想確保/檢查數據框 A 中的某個名稱是否存在 ID,並且數據框 B 中的相同名稱也存在該 ID。所有名稱都是唯一的,因此如果名稱出現兩次,則表示該名稱具有兩個不同的ID在不同的時間,卻是同一個人。 但是,某些名稱共享一個 ID。 在我的實際數據框中,還有許多沒有分配任何 ID 的名稱。

我的解決方案是檢查數據框 A 中的 Name 和 Present.ID 列的組合是否等同於數據框 B 中的 Name 和 Applied.ID 列的組合。

我正在尋找可以執行類似操作的功能

A$check <- A$Present.ID %in% B$Applied.ID 

但也增加了名稱列匹配的要求。

我希望輸出看起來像這樣:

  |name | Applied.ID | check|
  |-----|------------|------|
  |John | 12345      | TRUE |
  |Bill | 678910     | TRUE |
  |Amy  | 12345      | TRUE |
  |Bill |8090100     | TRUE |
  |Mia  | NA         | FALSE|

如果有什么令人困惑的地方,我很樂意澄清。 謝謝你的幫助!

使用interaction

cbind(A, check = interaction(A) %in% interaction(B))

  name Present.ID check
1 John      12345  TRUE
2 Bill     678910  TRUE
3  Amy      12345  TRUE
4 Bill    8090100  TRUE
5  Mia     246810 FALSE

甚至:

cbind(A, check = do.call(paste, A) %in% do.call(paste, B))


  name Present.ID check
1 John      12345  TRUE
2 Bill     678910  TRUE
3  Amy      12345  TRUE
4 Bill    8090100  TRUE
5  Mia     246810 FALSE

您可以使用mapply檢查項目是否匹配,然后在每一行上應用all

A$check <- apply(mapply(`%in%`, A, B), 1, all)

  name Present.ID check
1 John      12345  TRUE
2 Bill     678910  TRUE
3  Amy      12345  TRUE
4 Bill    8090100  TRUE
5  Mia     246810 FALSE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM