使用复杂语句在R中重新编码



我有40000行(SNPs(和500列(人类(的基因数据,看起来像

AA AG GG GA AA
CC CG CC GC GG
AC CC CA CA CC

仅呈现3个SNPs和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中对所有行和列执行此操作?

谢谢!

有很多方法可以解决这个问题,我会先为包含A的行创建一个索引向量,然后使用dplyr包的recode函数将替换项应用于不同的行。

# 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
)

最新更新