假设我有一个位置值列表:
> 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
)。
你知道怎么做吗?
提前致谢。
我们可以使用
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
使用矩阵:
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
对于 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