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

时间:2018-11-02 12:21:20

标签: r if-statement

我有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中对所有行和列执行此操作?

谢谢!

1 个答案:

答案 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
)