r - 寻找数据框值的范围

标签 r dataframe range

我有 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/

相关文章:

r - 向分组箱线图添加线条

r - 如何创建一个采用数据帧子集的列均值的函数?

r - 是否有 R 函数可以按列名的一部分创建子集?

r - 如何在 R 中进行哈希调用

go - 忽略 Go 范围内的值

r - 在 R 中,按特定字符分割字符向量;将第三 block 保存在新向量中

r - 如何使用 for 循环将函数应用于数据框中列中的特定值

Python - 在数据框中编码基因组数据

python - 重复数字序列 N 次并逐渐增加序列中的值 Python

matlab - 如何选择给定(非常大)矩阵的单个元素,查看它们是否在特定范围内并在 Matlab 中更改它们?