我无法在数据框的所有列上应用chartr()
函数,以便将字母转换为数字。
我在单列上管理它,但我希望能够在整个数据框上完成它。以下是我的数据示例:
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
从代码中可以看出,我想将A转换为1,C转换为2,G转换为3,T转换为4.我有40多列,因此重复上述相同的命令40次以上将是不切实际的(特别是如果我后来遇到相同的问题,比如数百列)
Sincerily, YKL
答案 0 :(得分:8)
为什么不使用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
现在你有两个具有相同列名的数据框,我觉得比将新列附加到旧数据更容易比较。特别是当有很多列时。
答案 1 :(得分: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 :(得分: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
答案 3 :(得分:2)
您还可以使用mgsub
qdap
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