0

I have 2 data frames:

frame1

First_Name  Last_Name 
John         Smith
Jane         Doe 
John         Doe

frame2

First_Name   Last_Name
John          Smith
Sally         Smith
Jane          Doe

I want to extract only rows where the First_Name and Last_Name columns match:

output:

First_Name    Last_Name
John            Smith
Jane            Doe

Thank you!

alex
  • 858
  • 5
  • 14

2 Answers2

0

We can use intersect from dplyr

library(dplyr)
intersect(frame1, frame2)
#   First_Name Last_Name
#1       John     Smith
#2       Jane       Doe

Or inner_join

inner_join(frame1, frame2)

Or using fintersect from data.table

library(data.table)
fintersect(setDT(frame1), setDT(frame2))

Or in base R with merge

merge(frame1, frame2)

data

frame1 <- structure(list(First_Name = c("John", "Jane", "John"), Last_Name = c("Smith", 
"Doe", "Doe")), class = "data.frame", row.names = c(NA, -3L))

frame2 <- structure(list(First_Name = c("John", "Sally", "Jane"), Last_Name = c("Smith", 
"Smith", "Doe")), class = "data.frame", row.names = c(NA, -3L
))
akrun
  • 874,273
  • 37
  • 540
  • 662
0

You can also try a base R solution with Reduce. Here the code:

Data:

#Data 1
frame1 <- structure(list(First_Name = c("John", "Jane", "John"), Last_Name = c("Smith", 
"Doe", "Doe")), class = "data.frame", row.names = c(NA, -3L))

#Data2
frame2 <- structure(list(First_Name = c("John", "Sally", "Jane"), Last_Name = c("Smith", 
"Smith", "Doe")), class = "data.frame", row.names = c(NA, -3L
))

The code:

#Code
df <- Reduce(function(x,y) merge(x,y,sort=F),x = list(frame1,frame2))

Output:

  First_Name Last_Name
1       John     Smith
2       Jane       Doe

Or just merge():

#Code2
merge(frame1,frame2,sort=F)

Output:

  First_Name Last_Name
1       John     Smith
2       Jane       Doe
Duck
  • 39,058
  • 13
  • 42
  • 84