在R中非常大的数据集中将2列组合成1列多次

S.R*_*.R. 5 merge r

在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值.

Dir*_*tel 8

你的意思是'合并'或'重新排列'或简单地连接?如果是后者那么

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)