2014-12-26 294 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