Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matching rows to columns and counting same occurences R

I have a dataset which is of the following form:-

a <- data.frame(X1=c("A", "B", "C", "A", "B", "C"),
                X2=c("B", "C", "C", "A", "A", "B"),
                X3=c("B", "E", "A", "A", "A", "B"),
                X4=c("E", "C", "A", "A", "A", "C"),
                X5=c("A", "C", "C", "A", "B", "B")
               )

And I have another set of the following form:-

b <- data.frame(col_1=c("ASD", "ASD", "BSD", "BSD"),
                col_2=c(1, 1, 1, 1),
                col_3=c(12, 12, 31, 21),
                col_4=("A", "B", "B", "A")
               )

What I want to do is to take the column col_4 from set b and match row wise in set a, so that it tell me which row has how many elements from col_4 in a new column. The name of the new column does not matters.

For ex:- The first and fifth row in set a has all the elements of col_4 from set b.

Also, duplicates shouldn't be found. For ex. sixth row in set a has 3 "B"s. But since col_4 from set b has only two "B"s, it should tell me 2 and not 3.

Expected output is of the form:-

c <- data.frame(X1=c("A", "B", "C", "A", "B", "C"),
                X2=c("B", "C", "C", "A", "A", "B"),
                X3=c("B", "E", "A", "A", "A", "B"),
                X4=c("E", "C", "A", "A", "A", "C"),
                X5=c("A", "C", "C", "A", "B", "B"),
                found=c(4, 1, 2, 2, 4, 2)
               )
like image 744
Shawn Brar Avatar asked Dec 03 '25 03:12

Shawn Brar


1 Answers

We can use vecsets::vintersect which takes care of duplicates.

Using apply row-wise we can count how many common values are there between b$col4 and each row in a.

apply(a, 1, function(x) length(vecsets::vintersect(b$col_4, x)))
#[1] 4 1 2 2 4 2
like image 67
Ronak Shah Avatar answered Dec 05 '25 19:12

Ronak Shah



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!