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