簡體   English   中英

根據不同的變量將變量值重新編碼為字符串

[英]Recode variable values into strings based on different variable

我有兩個數據集:

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"))

我想根據df2中的值(val)和標簽(lab)重新編碼df1中的v1。

在此之后,我的 output 應該如下所示:

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"))

我是否缺少任何 package 或 function 可以輕松解決此問題? 這個問題本身對我來說看起來很容易,但我沒有找到簡單的解決方案。 當然,總是可以編寫一個 for 循環,但它會使這個操作可能過於復雜,因為我想對大數據集多次執行此操作。

使用dplyr的選項將保留原始訂單

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

另一個base選項是使用merge ,這不會保持順序

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 

下面是一個簡單的解決方案:

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

這不會保持順序,但下面使用dplyr的方法也會保持順序。

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

我希望這有幫助

暫無
暫無

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

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