我正在寻找类似于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)
在基数 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