R 替换多个值

R 替换多个值,r,R,我想替换数据帧中的多个值。Dataframe引用lookup表(data.frame)并相应地替换值(参见lookupdf中的old_val和new_val列)。下面的代码可以正常工作。它在返回NA的查找表中找不到匹配项时遇到的唯一问题。我希望在数据帧中保留原始值 library(dplyr) foo <- data.frame(snp1 = c("AA", "AG", "AA", "AA"),

我想替换数据帧中的多个值。Dataframe引用
lookup
表(data.frame)并相应地替换值(参见
lookup
df中的
old_val
new_val
列)。下面的代码可以正常工作。它在返回NA的查找表中找不到匹配项时遇到的唯一问题。我希望在数据帧中保留原始值

   library(dplyr)
   foo <- data.frame(snp1 = c("AA", "AG", "AA", "AA"), 
                      snp2 = c("AA", "AT", "AG", "AA"), 
                      snp3 = c(NA, "GG", "GG", "GC"), stringsAsFactors=FALSE)
    
    lookup <- data.frame(old_val = c("AA", "AC", "AG"), 
                         new_val = c("0101", "0102", "0103"))
    
    foo2 <- foo %>% dplyr::select("snp1","snp2")
    foo2[] <- lookup$new_val[match(unlist(foo2), lookup$old_val)]
    output <- cbind(foo2, foo[!colnames(foo) %in% colnames(foo2)]) %>% 
      select(colnames(foo))
库(dplyr)

foo我们使用
碎片整理从“lookup”创建一个命名向量,在“foo”的列之间循环
,使用命名向量匹配并替换列值,然后如果与查找向量不匹配,则使用原始列合并
,返回原始值

library(dplyr)
library(tibble)
foo %>% 
     mutate(across(everything(), ~ coalesce(deframe(lookup)[.], .)))
-输出

#   snp1 snp2 snp3
#1 0101 0101 <NA>
#2 0103   AT   GG
#3 0101 0103   GG
#4 0101 0101   GC
#snp1 snp2 snp3
#1 0101 0101 
#2 0103在GG
#3010103 GG
#4 0101 0101 GC

这里有一个基本的R方法:

foo2 <- foo
foo2[] <- lookup$new_val[match(unlist(foo2), lookup$old_val)]
foo2[is.na(foo2)] <- foo[is.na(foo2)]
foo2

#  snp1 snp2 snp3
#1 0101 0101 <NA>
#2 0103   AT   GG
#3 0101 0103   GG
#4 0101 0101   GC
foo2