我有40000行(SNP)和500列(人类)的基因数据,看起来像
AA AG GG GA AA
CC CG CC GC GG
AC CC CA CA CC
仅显示3个SNP和5个人类的示例。
我需要使用接下来显示的键将字母转换为数字。请注意,三个字母A,C和G不能出现在同一行中。只有A和C或A和G或C和G。
如果A在行内显示,则密钥为:
AA = 0
AG =1
GG = 2
AC = 1
CC = 2
,如果未显示A,则密钥为:
CC = 0
CG = 1
GG = 2
请注意,一种情况下的CC为2,另一种情况下的CC为0。
因此示例如下:
0 1 2 1 0
0 1 0 1 2
1 2 1 1 2
如何在R中对所有行和列执行此操作?
谢谢!
答案 0 :(得分:2)
有许多解决方法,我将首先为包含A的行创建一个索引向量,然后使用recode
包的dplyr
函数将替换应用于不同的行。
# Creating the Matrix
X <- matrix(
c("AA", "AG", "GG", "GA", "AA",
"CC", "CG", "CC", "GC", "GG",
"AC", "CC", "CA", "CA", "CC"), byrow=TRUE, nrow=3)
# Index
index_a <- apply(X, 1, function(i){
any(grepl("A",i))
})
# NA matrix for the result
Y <- matrix(NA_integer_, nrow(X), ncol(X))
# First replacement
Y[index_a, ] <- dplyr::recode(
X[index_a, ],
AA = 0L,
AG = 1L,
GG = 2L,
AC = 1L,
CC = 2L,
GA = 1L,
CA = 1L
)
# Second replacement
Y[!index_a, ] <- dplyr::recode(
X[!index_a, ],
CC = 0L,
CG = 1L,
GG = 2L,
GC = 1L
)