すでに回答を受け入れているようですが、別の可能な解決策を次に示します。
この関数は一緒にハッキングされたばかりですが、より一般化するためにさらにいくつかの作業を行うことができます。
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
}
}
関数の機能は次のとおりです。
data.frame
最初に、行ごとに、最初の の 2 番目の列の値を、2 番目の の 2 番目および 3 番目の列の値と比較しますdata.frame
。
- 次に、それらのいずれかが両方の条件を満たしているかどうかを確認し
FALSE
、最初の からそれらを削除しますdata.frame
。
- 次に、最初
data.frame
の列を 2 番目の列で並べ替え、2 番目の列をdata.frame
"min" 一致列で並べ替えます。
- 最後に、最初のデータセットの値が指定された値の間にあることを確認するために、もう一度チェックを行います。そうでない場合、その行は削除されます。
さて、ここにいくつかのサンプルデータがあります。A
提供されたデータとB
同じです。さらなるテスト目的で変更されていますX
。とY
の間のマージでは、行は 1 つだけである必要があります。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