如果我知道范围,则在 R 中填充或填充数据框

Har*_*h K 7 r plyr dplyr

我正在寻找类似于bedtools minus但带有数据帧的东西。

例如,假设我在这里将范围作为数据框:

Start End Value
0 100 P
Run Code Online (Sandbox Code Playgroud)

我有另一个已排序的数据框:

Start End Value
10 25 A
50 63 B
Run Code Online (Sandbox Code Playgroud)

有没有办法像这样填充:

Start End Value
 0   9 P1
10  25 A
26  49 P2
50  63 B
64 100 P3
Run Code Online (Sandbox Code Playgroud)

填充 P1、P2 和 P3 标签以填充第二个数据帧,以便覆盖整个值范围。

我尝试使用 Dplyr 的 Lag 函数并手动添加填充值,但考虑到范围可以根据基因组特征的长度(包括开始和结束坐标)而变化,我希望此范围填充是自动的。

谢谢你!

例如,这是数据的一个小子集:

data_range<- data.frame(start=0, end=100, value="P")

tofill_range<- data.frame(start=c(15, 51, 70),end = c(39, 62, 79), value = c("A","B","C"))
Run Code Online (Sandbox Code Playgroud)

Ony*_*mbu 2

在基数 R 中:

all_ranges <- function(df1, df2){
  a <- sort(c(t(df1[-3]), t(df2[-3]), t(df2[-3]) + c(-1,1)))
  b <- data.frame(t(matrix(a,2)))
  d <- merge(df2, setNames(b, names(df1)[-3]), all = TRUE)
  replace(d, is.na(d), paste0(df1[,3], seq(sum(is.na(d)))))
}

data_range<- data.frame(start=0, end=100, value="P")

tofill_range<- data.frame(start=c(15, 51, 70),end = c(39, 62, 79), value = c("A","B","C"))

all_ranges(data_range, tofill_range)
#>   start end value
#> 1     0  14    P1
#> 2    15  39     A
#> 3    40  50    P2
#> 4    51  62     B
#> 5    63  69    P3
#> 6    70  79     C
#> 7    80 100    P4
Run Code Online (Sandbox Code Playgroud)

创建于 2023-02-23,使用reprex v2.0.2