我有两个数据列表,我希望将一个变量与另一个变量匹配,并在一个区间内匹配一个变量。我是通过循环完成的,但需要很长时间。我正在努力学习R并熟悉lapply家庭,并想知道我是否可以在这里使用它?或者,如果有任何其他解决方案。
我的解决方案:
x <- data.frame( A = c(1,2,3,4,5,6,2,3,4,5,5), B = c(67,49,49,59,68,91,67,48,49,67,91))
y <- data.frame( A = c(2,6,3,4,5,6,2,5,4,7,5), B = c(67,50,49,59,50,91,67,50,49,68,91))
ko <- data.frame(c())
for(i in 1:11){
wi <- which(y[,1] == x[i,1] & y[,2] <= (x[i,2] +10) & y[,2] >= (x[i,2] - 10))
t <- y[wi,]
ko <- rbind(ko, t)
}
在ko
中返回所需的结果。
答案 0 :(得分:1)
我们可以合并然后在结果上使用过滤器:
# merge
res <- merge(x, y, by = "A")
# then filter on interval
res <- res[ res$B.y <= res$B.x + 10 &
res$B.y >= res$B.x - 10, c("A", "B.y")]
colnames(res)[2] <- "B"
# compare to ko result, sort then check
ko <- ko[ order(ko$A, ko$B), ]
res <- res[ order(res$A, res$B), ]
all(ko == res)
# [1] TRUE