在R中非常大的数据集中将2列多次合并为1列
如果我可以使它们起作用,那么我正在研究的笨拙解决方案将不会很快,并且真正的数据集是〜1500 X 45000,因此它们需要很快。尽管有一些2)和3)的代码,但我现在确实对1)感到茫然。
这是数据结构的一个示例:
pop = data.frame(status = rbinom(n, 1, .42), sex = rbinom(n, 1, .5),
age = round(rnorm(n, mean=40, 10)), disType = rbinom(n, 1, .2),
rs123=c(1,3,1,3,3,1,1,1,3,1), rs123.1=rep(1, n), rs157=c(2,4,2,2,2,4,4,4,2,2),
rs157.1=c(4,4,4,2,4,4,4,4,2,2), rs132=c(4,4,4,4,4,4,4,4,2,2),
rs132.1=c(4,4,4,4,4,4,4,4,4,4))
因此,有几列基本的人口统计信息,然后其余的列是双等位基因SNP信息。例如:rs123是rs123的等位基因1,而rs123.1是rs123的第二等位基因。
1)我需要将当前在2列中的所有双等位基因SNP数据合并为1列,因此,例如:rs123和rs123.1合并为一列(但在数据集中):
11
31
11
31
31
11
11
11
31
11
2)我需要确定最不频繁的SNP值(在上面的示例中为31)。
3)我需要将最不频繁的SNP值替换为1,将其他SNP值替换为0。
最佳答案
您是说“合并”或“重新排列”,还是简单地串联在一起?如果是后者,那么
R> pop2 <- data.frame(pop[,1:4], rs123=paste(pop[,5],pop[,6],sep=""),
+ rs157=paste(pop[,7],pop[,8],sep=""),
+ rs132=paste(pop[,9],pop[,10], sep=""))
R> pop2
status sex age disType rs123 rs157 rs132
1 0 0 42 0 11 24 44
2 1 1 37 0 31 44 44
3 1 0 38 0 11 24 44
4 0 1 45 0 31 22 44
5 1 1 25 0 31 24 44
6 0 1 31 0 11 44 44
7 1 0 43 0 11 44 44
8 0 0 41 0 11 44 44
9 1 1 57 0 31 22 24
10 1 1 40 0 11 22 24
现在您可以在pop2上进行计数了,什么都没做:
R> sapply(pop2[,5:7], table)
$rs123
11 31
6 4
$rs157
22 24 44
3 3 4
$rs132
24 44
2 8
R>