SNP的组合

时间:2018-10-10 14:40:41

标签: r matrix combinations

我是R编程的新手。我有一个矩阵,其中包含2029行(个人)和1129列(SNP标记)。所有矩阵都是1或0。我想将每个个体的snps的所有组合计算为0 * 1 = 1和1 * 0 = 1以及0 * 0 = 0和1 * 1 = 0。我是通过for编写的脚本。但是可以用combn编写吗?

示例

  x1  x2  x3  x4

i1 1 0 0 1

i2 0 1 1 0

i3 1 0 0 0

对于每个i,我应该计算x1×x2,x1×x3,x1×x4,x2×x3,x2×x4,x3×x4。每个的结果应该是我上面写的,即1×0 = 1等。请注意,这种情况不是乘法。我的意思是,如果一个为0,另一个为1,则为我放1。

好,保存后我的矩阵变形了。请想象一个从x1到x4的四列矩阵。从i1到i3的三行。 随机输入0和1作为输入。

1 个答案:

答案 0 :(得分:0)

假设您有一个像这样的数据框作为输入:

df <- data.frame( # as a minimal example
  x1 = rbinom(10,1,0.5),
  x2 = rbinom(10,1,0.5),
  x3 = rbinom(10,1,0.5),
  x4 = rbinom(10,1,0.5)
)

首先,我们获得所有可能的SNP组合(每列1个):

cn <- combn(colnames(df), 2)

对于每种组合,我们都应用一个函数来执行此操作: 1.我们在df中选择与可能的组合相对应的“ x”列 2.对于每个人(在df中行),我们将两个值相加(如果0 * 0返回0,如果1 * 0或0 * 1返回1,如果1 * 1返回2)

gn <- apply(cn, 2, function(x) {
  rowSums(df[, x]) 
})

然后我们将2替换为0,以获得所需的输出:

gn[gn == 2] <- 0

我们最终可以使用SNP组合来命名列:

colnames(gn) <- apply(cn, 2, paste0, collapse = "*")

gn

输出

      x1*x2 x1*x3 x1*x4 x2*x3 x2*x4 x3*x4
 [1,]     0     0     0     0     0     0
 [2,]     1     0     1     1     0     1
 [3,]     1     0     1     1     0     1
 [4,]     1     1     0     0     1     1
 [5,]     1     1     1     0     0     0
 [6,]     1     0     0     1     1     0
 [7,]     0     1     1     1     1     0
 [8,]     0     0     0     0     0     0
 [9,]     1     0     0     1     1     0
[10,]     1     0     1     1     0     1