对于列中的每个值,检查它是否属于另一个数据帧中的任何间隔

问题描述 投票:0回答:3

假设我有一个位置值列表:

> head(jap["POS"])
      POS
1  836924
2  922009
3 1036959
4 141607615
5 164000000 
6 118528028 
[...]

和间隔列表:

> genes_of_interest
       MGAM        SI      TREH    SLC2A2  SLC2A5   SLC5A1  TAS1R3       LCT
1 141607613 164696686 118528026 170714137 9095166 32439248 1266660 136545420
2 141806547 164796284 118550359 170744539 9148537 32509016 1270694 136594754

我想检查第一个数据帧中的每个位置,如果它在第二个数据帧的任何间隔内。

所以在这种情况下,我应该有

FALSE FALSE FALSE TRUE FALSE TRUE

因为

141607615
属于第一区间(
MGAM
)而
118528028
属于第三区间(
TREH
)。

你知道怎么做吗?

提前致谢。

r dataframe compare intervals
3个回答
0
投票

我们可以使用

sapply
遍历
genes_of_interest
中的所有列,并将
jap
中显示的位置与间隔进行比较。然后用另一个
apply
包起来,判断行中的
any
是否为
TRUE
。或者我们可以用
apply
替换外面的
as.logical(rowSums())
,两个函数的输出是一样的。

注意

between
函数来自
dplyr
包。

library(dplyr)

apply(sapply(1:ncol(genes_of_interest), \(x) between(jap$POS, genes_of_interest[1, x], genes_of_interest[2, x])), 1, any)

# or 

as.logical(rowSums(sapply(1:ncol(genes_of_interest), \(x) between(jap$POS, genes_of_interest[1, x], genes_of_interest[2, x]))))

输出

[1] FALSE FALSE FALSE  TRUE FALSE  TRUE

0
投票

使用矩阵:

a <- matrix(jap$POS, nrow(df), ncol(df2))
b <- t(genes_of_interest)
low <- matrix(b[,1], nrow(df), ncol(df2), byrow = TRUE)
up <- matrix(b[,2], nrow(df), ncol(df2), byrow = TRUE)
rowSums(a > low & a < up)>0
[1] FALSE FALSE FALSE  TRUE FALSE  TRUE

0
投票

对于 dplyr 1.1.0 及更高版本,如果您首先将

left_join()
转换为整洁的格式,则可以使用非 equi
genes_of_interest
。这将非常快,如果您还有其他列也可以加入,应该非常灵活。

library(dplyr, warn.conflicts = FALSE)
library(tidyr)

jap <- tibble(
  POS = c(836924, 922009, 1036959, 141607615, 164000000, 118528028)
)

genes_of_interest <- tribble(
  ~MGAM, ~SI, ~TREH, ~SLC2A2, ~SLC2A5, ~SLC5A1, ~TAS1R3, ~LCT,
  141607613, 164696686, 118528026, 170714137, 9095166, 32439248, 1266660, 136545420,
  141806547, 164796284, 118550359, 170744539, 9148537, 32509016, 1270694, 136594754
)

# Manipulate `genes_of_interest` into a tidy data format
genes_of_interest <- genes_of_interest %>%
  mutate(bound = c("start", "end")) %>%
  pivot_longer(-bound) %>%
  pivot_wider(names_from = bound, values_from = value) %>%
  mutate(match = TRUE)

genes_of_interest 
#> # A tibble: 8 × 4
#>   name       start       end match
#>   <chr>      <dbl>     <dbl> <lgl>
#> 1 MGAM   141607613 141806547 TRUE 
#> 2 SI     164696686 164796284 TRUE 
#> 3 TREH   118528026 118550359 TRUE 
#> 4 SLC2A2 170714137 170744539 TRUE 
#> 5 SLC2A5   9095166   9148537 TRUE 
#> 6 SLC5A1  32439248  32509016 TRUE 
#> 7 TAS1R3   1266660   1270694 TRUE 
#> 8 LCT    136545420 136594754 TRUE

jap %>%
  left_join(
    genes_of_interest,
    by = join_by(between(POS, start, end)),
    multiple = "any"
  ) %>%
  mutate(match = !is.na(match))
#> # A tibble: 6 × 5
#>         POS name      start       end match
#>       <dbl> <chr>     <dbl>     <dbl> <lgl>
#> 1    836924 <NA>         NA        NA FALSE
#> 2    922009 <NA>         NA        NA FALSE
#> 3   1036959 <NA>         NA        NA FALSE
#> 4 141607615 MGAM  141607613 141806547 TRUE 
#> 5 164000000 <NA>         NA        NA FALSE
#> 6 118528028 TREH  118528026 118550359 TRUE
© www.soinside.com 2019 - 2024. All rights reserved.