我有两个数据表,dt1
和dt2
,其中前两列代表染色体和位置,其余列代表不同样本的基因型值(0,1,2)。
两个表中的列结构相同(dt 1和dt 2具有相同的样本),但位置可能不同。
dt1 <- data.table(Chromosome = c("chr1", "chr1", "chr2"),
Position = c(100, 200, 300),
Sample1 = c(0, 0, 1),
Sample2 = c(1, 1, 2))
dt2 <- data.table(Chromosome = c("chr1", "chr2", "chr2"),
Position = c(200, 300, 400),
Sample1 = c(0, 1, 2),
Sample2 = c(0, 1, 0))
我想创建第三个表dt3
,前两列是染色体和位置。dt 3中的位置列应包括dt 1或dt 2中存在的所有位置。对于每个位置,其余列应代表样品名称,如果两个表之间的基因型不同,或者如果基因型存在于一个表中但不存在于另一个表中,则单元格应标记为1;否则,单元格应标记为0。
这个表很大,所以我期待使用data.table或R的一些特性来进行有效的处理
预期输出:
dt3
Chromosome Position Sample1 Sample2
1: chr1 100 1 1 # chr1:100 only exist in dt1
2: chr1 200 0 1 # chr1:200 is difference in sample2
3: chr2 300 0 1 # chr2: 300 is difference in sample 2
3: chr2 400 1 1 # chr2:400 only exist in dt2
2条答案
按热度按时间6l7fqoea1#
您可以使用R中的data.table包有效地实现所需的输出。下面是根据您描述的条件创建dt3表的代码:
这段代码首先将dt1和dt2转换为data.table对象,并设置键列以实现有效的合并。然后,它对键列执行合并,使用all = TRUE来包括dt1或dt2中存在的所有位置。所得合并表dt3包括来自两个表的所有位置和基因型。
接下来,它在样本列上循环并比较基因型。如果基因型不同,或者基因型存在于一个表中但不存在于另一个表中,则它分配值1。否则,它将赋值为0。
最后,对样本列进行重命名以删除“Sample1_”和“Sample2_”前缀,从而得到所需的输出。
注意:如果您有一个大型数据集,使用data.table和设置键列将有助于优化合并和计算的性能。
kuuvgm7e2#
正如你也标记了这个
dplyr
一样,有一种方便的方法可以使用dplyr syntax. The
dtplyrpackage will write (and apply) the
data.table代码创建
data.table`解决方案:这为您提供了一些方便的
data.table
代码,您可以提取、整理和使用这些代码。