我是R程序的新手。我有一个有2029行(个体)和1129列(SNP标记)的矩阵。所有的矩阵都是1或0。我要计算每个个体的所有snps组合,如0*1=1和1*0=1,0*0=0和1*1=0。我是按剧本写的。但是可以用梳子写字吗?
示例
x1 x2 x3 x4i1 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作为随机输入。
发布于 2018-10-10 19:10:28
如果您有这样的数据框架作为输入:
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中选择对应于可能组合2的列"x“。对于每个个体(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我们最终可以用SNPs组合来命名列:
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 1https://stackoverflow.com/questions/52742796
复制相似问题