我看到您已经接受了答案,但这是另一种可能的解决方案。
这个功能只是被组合在一起,但可以进行更多工作以使其更通用。
myfun = function(DATA1, DATA2, MATCH1, MIN, MAX) {
  temp = sapply(1:nrow(DATA2), 
                function(x) DATA1[[MATCH1]] >= DATA2[[MIN]][x] &
                  DATA1[[MATCH1]] <= DATA2[[MAX]][x])
  if (isTRUE(any(rowSums(temp) == 0))) {
    temp1 = DATA1[-(which(rowSums(temp) == 0)), ]
  }
  OUT = cbind(temp1[order(temp1[[MATCH1]]), ], 
              DATA2[order(DATA2[[MIN]]), ], row.names=NULL)
  condition = ((OUT[4] <= OUT[2] & OUT[2] <= OUT[5]) == 0)
  if (isTRUE(any(condition))) {
    OUT[-which(condition), ]
  } else {
    OUT
  }
}
以下是该函数的作用:
- 它首先逐行比较 first 的第二列中的
data.frame值与 second 的第二列和第三列中的值data.frame。 
- 然后,它会检查其中是否有任何一个
FALSE同时满足这两个条件,并将它们从第一个data.frame. 
- 然后,它按
data.frame第二列对第一个排序,第二个data.frame按“min”匹配列排序。 
- 最后,它再次检查以确保第一个数据集中的值在提供的值之间;如果不是,则删除该行。
 
现在,这里有一些示例数据。A并且B与您提供的数据相同。X并Y已为进一步测试目的进行了更改。在 和 之间的合并中X,Y应该只有一行。
A = read.table(header=TRUE, text="A      B
    rs10    23353
    rs100   10000
    rs234   54440")
B = read.table(header=TRUE, text="A        B      C
    E235    20000   30000
    E255    50000   60000")
X = A[c(3, 1, 2), ]
X[1, 2] = 57000
Y = B
Y[2, 3] = 55000
以下是您将如何使用该函数以及您将获得的输出。
myfun(A, B, 2, 2, 3)
#       A     B    A     B     C
# 1  rs10 23353 E235 20000 30000
# 2 rs234 54440 E255 50000 60000
myfun(X, Y, 2, 2, 3)
#      A     B    A     B     C
# 1 rs10 23353 E235 20000 30000