我是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作为输入。
答案 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