在整个数据框中将字母转换为数字

5

我在将字母转换为数字时,无法对数据框的所有列应用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多次是不切实际的(特别是如果我以后遇到同样的问题,例如有数百列数据)

真诚地, ykl

4个回答

10

为什么不使用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

现在你有两个具有相同列名的数据框,我发现与在旧数据中添加新列相比,这样更容易进行比较。特别是当有许多列时。


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

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

2
你可以使用 qdap 中的 mgsub
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接