Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Match values in data frame with values in another data frame and replace former with a corresponding pattern from the other data frame

Tags:

Complicated title but here is a simple example of what I am trying to achieve:

d <- data.frame(v1 = c(1,2,3,4,5,6,7,8),                  v2 = c("A","E","C","B","B","C","A","E"))  m <- data.frame(v3 = c("D","E","A","C","D","B"),                  v4 = c("d","e","a","c","d","b")) 

Values in d$v2 should be replaced by values in m$v4 by matching the values from d$v2 in m$v3

The resulting data frame d should look like:

v1    v4 1      a 2      e 3      c 4      b 5      b 6      c 7      a 8      e 

I tried different stuff and the closest I came was: d$v2 <- m$v4[which(m$v3 %in% d$v2)]

I try to avoid any for-loops again! Must be possible :-) somehow... ;)

like image 631
user969113 Avatar asked Jul 17 '12 20:07

user969113


People also ask

How do you replace a DataFrame value in Python?

Pandas DataFrame replace() Method The replace() method replaces the specified value with another specified value. The replace() method searches the entire DataFrame and replaces every case of the specified value.

What is the difference between Cbind and data frame?

The data. frame() function works very similarly to cbind() – the only difference is that in data. frame() you specify names to each of the columns as you define them. Again, unlike matrices, dataframes can contain both string vectors and numeric vectors within the same object.


1 Answers

You could try:

merge(d,m, by.x="v2", by.y="v3")   v2 v1 v4 1  A  1  a 2  A  7  a 3  B  4  b 4  B  5  b 5  C  3  c 6  C  6  c 7  E  2  e 8  E  8  e 

Edit

Here is another approach, to preserve the order:

data.frame(v1=d$v1, v4=m[match(d$v2, m$v3), 2])   v1 v4 1  1  a 2  2  e 3  3  c 4  4  b 5  5  b 6  6  c 7  7  a 8  8  e 
like image 162
johannes Avatar answered Sep 21 '22 14:09

johannes