我有一个包含任何这些值的数据框.
from=c("A","C","G","T","R","Y","M","K","W", "S","N")
Run Code Online (Sandbox Code Playgroud)
我想用相应的替换
to=c("AA","CC","GG","TT","AG","CT","AC","GT","AT", "CG","NN")
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么,循环遍历所有要替换的值?或循环遍历矩阵位置.或任何其他解决方案?
dd<-matrix(sample(from, 100, replace=TRUE), 10)
dd
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "K" "S" "G" "T" "R" "N" "A" "C" "W" "M"
[2,] "Y" "K" "S" "G" "T" "R" "N" "A" "C" "W"
[3,] "M" "Y" "K" "S" "G" "T" "R" "N" "A" "C"
[4,] "W" "M" "Y" "K" "S" "G" "T" "R" "N" "A"
[5,] "C" "W" "M" "Y" "K" "S" "G" "T" "R" "N"
[6,] "A" "C" "W" "M" "Y" "K" "S" "G" "T" "R"
[7,] "N" "A" "C" "W" "M" "Y" "K" "S" "G" "T"
[8,] "R" "N" "A" "C" "W" "M" "Y" "K" "S" "G"
[9,] "T" "R" "N" "A" "C" "W" "M" "Y" "K" "S"
[10,] "G" "T" "R" "N" "A" "C" "W" "M" "Y" "K"
Run Code Online (Sandbox Code Playgroud)
我使用循环遍历所有.
myfunc<-function(xx){
from=c("A","C","G","T","R","Y","M","K","W", "S","N");
to=c("AA","CC","GG","TT","AG","CT","AC","GT","AT", "CG","NN");
for (i in 1:11){
xx[xx==from[i]]<-to[i];
}
return(xx);
}
Run Code Online (Sandbox Code Playgroud)
它适用于小矩阵,但需要很长时间才能使用大矩阵.任何有效的解决方案?
谢谢
Mar*_*gan 25
创建一个地图
map = setNames(to, from)
Run Code Online (Sandbox Code Playgroud)
从A到B
dd[] = map[dd]
Run Code Online (Sandbox Code Playgroud)
地图用作查找,将"从"名称与"到"值相关联.赋值保留矩阵维和dimnames.
matrix(to[match(dd,from)], nrow=nrow(dd))
Run Code Online (Sandbox Code Playgroud)
match 返回没有维度的向量,因此您需要重新创建矩阵.