我有 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
并且落在 access的范围(或区域)中
数据框。例如,新数据框将类似于:peaks
dataframe's
access
数据框中不存在第 1 行区域,因此它将被分配到类别 U。第 2 行
peaks
落在access
数据帧(第 2 行)中的给定范围内,将被分配到类别 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
所以现在有一个额外的条件,如果 access 中的行落在峰值范围内,那么还将 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
中的值为 notFound,因为未找到该区域,在其余情况下,我们从修改后的访问 df 中获取 V5 中的值。
最佳答案
如果速度是一个问题,链接的 data.table
解决方案可能会更好,但它也可以在 dplyr
中实现,但可能要慢得多:
library(dplyr)
names(access)[2:3] <- c('start', 'end')
bind_cols(peaks[-1], access) %>%
rowwise() %>%
mutate(V4 = if_else(all(V2:V3 %in% start:end), 'B',
if_else(any(V2:V3 %in% start:end), 'A',
'U')))
结果:
Source: local data frame [5 x 6]
Groups: <by row>
# A tibble: 5 x 6
V2 V3 V1 start end V4
<int> <int> <fctr> <int> <int> <chr>
1 126122 126533 chr10 136122 136533 U
2 179450 179730 chr10 179432 179769 B
3 182788 183350 chr10 182988 183371 A
4 224244 224500 chr10 224234 224489 A
5 237695 237950 chr10 237693 237958 B
关于r - 寻找数据框值的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38432826/