【发布时间】:2016-07-18 09:14:34
【问题描述】:
我有 2 个数据框:
> access
V1 V2 V3
1 chr10 136122 136533
2 chr10 179432 179769
3 chr10 182988 183371
4 chr10 224234 224489
5 chr10 237693 237958
和
> peaks
V1 V2 V3
1 chr10 126122 126533
2 chr10 179450 179730
3 chr10 182788 183350
4 chr10 224244 224500
5 chr10 237695 237950
V2 和 V3 列是两个数据帧中区域(范围)的开始和结束。我想将这些行保留在peaks 数据帧中,其中access$V1 == peaks$V1 AND 属于access 数据帧的范围(或区域)。例如,新的数据框将类似于:peaks dataframe's
access数据帧中不存在第一行区域,因此将为其分配类别 U。peaks的第二行在access数据帧(第二行)中的给定范围内,将被分配类别B。peaks的第 3 行并不完全属于该区域,但它与access的第 3 行中的区域有某种重叠,为此我将分配类别 A。peaks的第 4 行在访问第 4 行区域结束后的第 11 个数字结束处也没有完全重叠,这也属于 A 类别。第 5 行属于该区域,因此属于 B 类别。
预期输出:
> newdf
V1 V2 V3 V4
1 chr10 126122 126533 U
2 chr10 179450 179730 B
3 chr10 182788 183350 A
4 chr10 224244 224500 A
5 chr10 237695 237950 B
这里是输入数据帧的输出:
> dput(peaks)
structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "chr10", class = "factor"),
V2 = c(126122L, 179450L, 182788L, 224244L, 237695L), V3 = c(126533L,
179730L, 183350L, 224500L, 237950L)), .Names = c("V1", "V2",
"V3"), class = "data.frame", row.names = c(NA, -5L))
> dput(access)
structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "chr10", class = "factor"),
V2 = c(136122L, 179432L, 182988L, 224234L, 237693L), V3 = c(136533L,
179769L, 183371L, 224489L, 237958L)), .Names = c("V1", "V2",
"V3"), class = "data.frame", row.names = c(NA, -5L))
编辑:
我的新访问 df 看起来像这样,现在我还想在最终输出 df 中附加最后一列:
> access
V1 V2 V3 V4
1 chr10 136122 136533 found
2 chr10 179432 179769 notFound
3 chr10 182988 183371 found
4 chr10 224234 224489 found
5 chr10 237693 237958 notFound
所以现在有一个额外的条件,如果访问中的行落在峰值范围内,那么还将 V4 中的值附加到最终 df 的新列中,如果未找到某个区域,则默认情况下将是 notFound。因此,最终输出将是:
> newdf
V1 V2 V3 V4 V5
1 chr10 126122 126533 U notFound
2 chr10 179450 179730 B notFound
3 chr10 182788 183350 A found
4 chr10 224244 224500 A found
5 chr10 237695 237950 B notFound
在row1$V5 中,该值未找到,因为未找到该区域,在其余情况下,我们从修改后的访问 df 中获取了 V5 中的值。
【问题讨论】:
-
@zx8754 不同之处在于这个问题它只是检查一个数字是否存在于范围内,在这里我正在搜索一个范围(不是数字)其他范围.
-
@zx8754
newdf <- subset(merge(access, peaks), start <= V2 & V3 <= end)这只是给我那些属于这些范围的人,我无法弄清楚如何为他们分配我定义的类别以及如何保留那些不完全属于在那些范围内。你能帮我解决这个问题吗? -
foverlaps的开发正是如此——考虑到遗传区域重叠。阅读函数的type和nomatch参数。 -
@zx8754 我已经尝试过,但我无法做我想做的事。当我使用
type= "all"时,我得到的行在这些范围内,并且重叠但不完全在该范围内,当我使用type = "within"时,我只得到在给定范围内的行。所以我知道我必须使用type= "all",但我不知道如何根据我定义的类别标记这些行。请在这种情况下帮助我。谢谢。