在R中非常大的数据集中将2列组合成1列多次
我正在研究的笨拙的解决方案不会非常快,如果我可以让他们工作,真正的数据集是~1500 X 45000所以他们需要快速.虽然我有一些2)和3)的代码,但我在这一点上绝对不知所措.
这是数据结构的玩具示例:
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))
Run Code Online (Sandbox Code Playgroud)
因此,有几列基本人口统计信息,然后其余列是双等位SNP信息.例如:rs123是rs123的等位基因1,rs123.1是rs123的第二个等位基因.
1)我需要将当前在2列中的所有双等位基因SNP数据合并为1列,例如:rs123和rs123.1合并为一列(但在数据集中):
11
31
11
31
31
11
11
11
31
11
Run Code Online (Sandbox Code Playgroud)
2)我需要识别最不频繁的SNP值(在上面的例子中它是31).
3)我需要用1替换最不频繁的SNP值,用0替换其他的SNP值.
你的意思是'合并'或'重新排列'或简单地连接?如果是后者那么
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
Run Code Online (Sandbox Code Playgroud)
现在你可以在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>
Run Code Online (Sandbox Code Playgroud)