2014-12-26 242 views
4

我在将数字转换为字母的所有数据框的列上应用chartr()函数时遇到问题。R将字母转换为整个数据框中的数字

我在单列上管理它,但我希望能够在整个数据框上完成它。这是我的数据的一个示例:

ID = c(1,2,3) 
POS1 = c('AG','GC','TT') 
POS2 = c('GT','CC','TC') 
POS3 = c('GG','CT','AT') 
DF = data.frame(ID,POS1,POS2,POS3) 

DF$POS1X <- chartr('ACGT','1234',DF$POS1) 

    ID POS1 POS2 POS3 POS1X 
1 1 AG GT GG 13 
2 2 GC CC CT 32 
3 3 TT TC AT 44 

如从代码看出,我想甲C G转换为1,2,3,和T 4。我有40+列和从而重复相同的命令如上40+次将是不切实际的(尤其是如果我遇到同样的问题,后来就用说几百列)

Sincerily, YKL

回答

5

为什么不使用lapply

DF2 <- DF ## to not overwrite the original DF 
DF2[-1] <- lapply(DF2[-1], chartr, old = "ACGT", new = "1234") 
DF2 
# ID POS1 POS2 POS3 
# 1 1 13 34 33 
# 2 2 32 22 24 
# 3 3 44 42 14 

现在您有两个等效列名的数据框,我发现比旧数据附加新列更容易比较。特别是当有许多列时。

3
> cbind(DF, setNames(lapply(DF[-1], chartr, old='ACGT', new='1234'), 
         paste0("POS", 1:(length(DF)-1),"X")) ) 
    ID POS1 POS2 POS3 POS1X POS2X POS3X 
1 1 AG GT GG 13 34 33 
2 2 GC CC CT 32 22 24 
3 3 TT TC AT 44 42 14 
4

使用dplyr

library(dplyr) 
DF %>% mutate_each(funs(chartr("ACGT", "1234", .))) 

你得到:

ID POS1 POS2 POS3 
1 1 13 34 33 
2 2 32 22 24 
3 3 44 42 14 
2

你也可以使用mgsubqdap

library(qdap) 
DF[paste0('POS', 1:3,'X')] <- mgsub(c('A', 'C', 'G', 'T'), 1:4, 
       as.matrix(DF[-1])) 
DF 
# ID POS1 POS2 POS3 POS1X POS2X POS3X 
#1 1 AG GT GG 13 34 33 
#2 2 GC CC CT 32 22 24 
#3 3 TT TC AT 44 42 14