我看到您已经接受了答案,但这是另一种可能的解决方案。
这个功能只是被组合在一起,但可以进行更多工作以使其更通用。
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