【发布时间】:2018-01-11 12:30:22
【问题描述】:
原始question 的一个更简单的版本,我问过,但还没有人回答。
我有一个巨大的输入文件(其代表性示例如下所示为input):
> input
CT1 CT2 CT3
1 chr1:200-400 chr1:250-450 chr1:400-800
2 chr1:800-970 chr2:200-500 chr1:700-870
3 chr2:300-700 chr2:600-1000 chr2:700-1400
我想按照规则(如下所述)处理它,以便我得到 output 之类的:
> output
CT1 CT2 CT3
chr1:200-400 1 1 0
chr1:800-970 1 0 1
chr2:300-700 1 1 0
chr1:250-450 1 1 1
chr2:200-500 1 1 0
chr2:600-1000 1 1 1
chr1:400-800 0 1 1
chr1:700-870 1 0 1
chr2:700-1400 0 1 1
规则:
获取数据帧的每个索引(在这种情况下第一个是chr1:200-400),看看它是否与数据帧中的任何其他值重叠。如果是,在它所在的那一列下面写1,如果不是,写0。
例如,如果我们采用输入input[1,1] 的第一个索引,即chr1:200-400。由于它存在于第 1 列中,我们将在其下方写 1。现在我们将检查此范围是否与input 中任何其他列中存在的任何其他范围重叠。该值仅与第二列 (CT2) 的第一个值 (chr1:250-450) 重叠,因此,我们也在其下方写入 1。由于与CT3 中的任何值都没有重叠,我们在输出数据帧中的CT3 下方写入0。
这是input和output的输入:
> dput(input)
structure(list(CT1 = structure(1:3, .Label = c("chr1:200-400",
"chr1:800-970", "chr2:300-700"), class = "factor"), CT2 = structure(1:3, .Label = c("chr1:250-450",
"chr2:200-500", "chr2:600-1000"), class = "factor"), CT3 = structure(1:3, .Label = c("chr1:400-800",
"chr1:700-870", "chr2:700-1400"), class = "factor")), .Names = c("CT1",
"CT2", "CT3"), class = "data.frame", row.names = c(NA, -3L))
> dput(output)
structure(list(CT1 = c(1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L), CT2 = c(1L,
0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L), CT3 = c(0L, 0L, 0L, 0L, 0L,
1L, 1L, 1L, 1L)), .Names = c("CT1", "CT2", "CT3"), class = "data.frame", row.names = c("chr1:200-400",
"chr1:800-970", "chr2:300-700", "chr1:250-450", "chr2:200-500",
"chr2:600-1000", "chr1:400-800", "chr1:700-870", "chr2:700-1400"
))
【问题讨论】:
-
所以这是您其他问题的准确副本?
-
不是确切的副本,规则有点复杂,我想要
1仅用于那些超过总范围 50% 的重叠。在这里,我只要求重叠。如果有任何重叠,分配 1。 -
您需要定义“重叠”,因为我无法理解您的输出中零和一的分配 - 我会期待其他的东西
-
@RolandASc
input[1,1](200-400) 和input[1,2](250-400) 之间的重叠为 150。此外,chr应该相同,在这种情况下为chr1。input[1,1]区域与input[,3]区域中的任何一个都没有重叠,因为 chr1 从 400 开始。现在有意义吗?
标签: r dataframe range bioinformatics overlapping