简体   繁体   中英

Recode variable values into strings based on different variable

I have two datasets:

df1:

structure(list(v1 = c(1, 4, 3, 7, 8, 1, 2, 4)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

df2:

structure(list(val = c(1, 2, 3, 4, 5, 6, 7, 8, 9), lab = c("a", 
"b", "c", "d", "e", "f", "g", "h", "i")), row.names = c(NA, -9L
), class = c("tbl_df", "tbl", "data.frame"))

I want to recode v1 in df1 according to the values (val) and labels (lab) in df2.

Following this, my output would should look like this:

df3:

structure(list(v1 = c("a", "d", "c", "g", "h", "a", "b", "d")), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

Is there any package or function I am missing which could easily solve this problem? The problem itself looks quite easy to me but I found no simple solution. Of course, writing a for loop would be always possible but it would make this operation probably too complicated as I want to do this many times with big datasets.

An option using dplyr which will keep the original order

library(dplyr)
new_df <- df1 %>% 
transmute(v1 = left_join(df1, df2, by = c("v1" = "val"))$lab)

#  v1   
#  <chr>
#1 a    
#2 d    
#3 c    
#4 g    
#5 h    
#6 a    
#7 b    
#8 d   

identical(new_df, df3)

#[1] TRUE

Another base option is using merge , this will not keep the order

df1$v1 <- merge(df1, df2, all.x = TRUE, by.x = "v1", by.y = "val")$lab

#  v1   
#  <chr>
#1 a    
#2 a    
#3 b    
#4 c    
#5 d    
#6 d    
#7 g    
#8 h 

Below is a simple solution:

X<-as.data.frame(df1)
Y<-as.data.frame(df2)

final_df <- merge(X, Y, all.x = TRUE, by.x = "v1", by.y = "val")
print(final_df)

output

  v1 lab
1  1   a
2  1   a
3  2   b
4  3   c
5  4   d
6  4   d
7  7   g
8  8   h

This will not keep the order, but below approach using the dplyr will keep the order also.

library(dplyr)

X<-as.data.frame(df1)
Y<-as.data.frame(df2)

final_df <- X %>% 
transmute(v1 = left_join(X, Y, by = c("v1" = "val"))$lab)
print(final_df)

output

  v1
1  a
2  d
3  c
4  g
5  h
6  a
7  b
8  d

I hope this helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM