r - 使用复杂语句在 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 中为所有行和列执行此操作?
谢谢!
解决方案
有很多方法可以解决这个问题,我会先为包含 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
)
推荐阅读
- angular - Angular 6 属性指令字段未定义
- maven - Artifactory OSS在运行maven release时抛出405异常:执行
- dji-sdk - 矩阵 210 RTK 硬件同步
- html - 如何防止列表中的项目溢出到下一列?
- php - 增加内存限制作曲家
- javascript - 如何使用异步减速器来构建一系列承诺?
- angularjs - 选择日期给出一个对象,而不是日期
- javascript - 如何模拟用户创建的窗口属性?
- python - Django Rest Framework 是所有者
- postgresql - 在 Postgres 10 的分区表中插入带有 onConflict 子句的多行