在R中用另一个替换值列表

Ana*_*nta 19 r

我有一个包含任何这些值的数据框.

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.

  • @Ananta我想`ll`是data.frame,而不是矩阵,与您的问题有很大不同。您可以`ll [] = map [as.matrix(ll)]`。也不清楚“ ll2”是什么。也许您想重新访问您的问题?注意,因为数据框列很可能是因素。 (2认同)

The*_*ras 5

matrix(to[match(dd,from)], nrow=nrow(dd))
Run Code Online (Sandbox Code Playgroud)

match 返回没有维度的向量,因此您需要重新创建矩阵.