首页 > 解决方案 > 使用复杂语句在 R 中重新编码

问题描述

我有 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,在另一种情况下为 0。

所以例子看起来像:

0 1 2 1 0
0 1 0 1 2
1 2 1 1 2

如何在 R 中为所有行和列执行此操作?

谢谢!

标签: rif-statement

解决方案


有很多方法可以解决这个问题,我会先为包含 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
)

推荐阅读