首页
学习
活动
专区
圈层
工具
发布

SNP组合
EN

Stack Overflow用户
提问于 2018-10-10 14:40:40
回答 1查看 63关注 0票数 0

我是R程序的新手。我有一个有2029行(个体)和1129列(SNP标记)的矩阵。所有的矩阵都是1或0。我要计算每个个体的所有snps组合,如0*1=1和1*0=1,0*0=0和1*1=0。我是按剧本写的。但是可以用梳子写字吗?

示例

代码语言:javascript
复制
  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作为随机输入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-10 19:10:28

如果您有这样的数据框架作为输入:

代码语言:javascript
复制
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次):

代码语言:javascript
复制
cn <- combn(colnames(df), 2)

对于每个组合,我们应用一个函数: 1.在df中选择对应于可能组合2的列"x“。对于每个个体(df中的行),我们将两个值之和(如果0*0返回0,如果1*0或0*1返回1,如果1*1返回2)。

代码语言:javascript
复制
gn <- apply(cn, 2, function(x) {
  rowSums(df[, x]) 
})

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

代码语言:javascript
复制
gn[gn == 2] <- 0

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

代码语言:javascript
复制
colnames(gn) <- apply(cn, 2, paste0, collapse = "*")

gn

输出

代码语言:javascript
复制
      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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52742796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档