2016-11-10 7 views
1

私は1つの変数を別の変数に、そしてある変数をある区間に1つずつマッチさせたいという2つのデータリストを持っています。私はループでこれをやったが、非常に長い時間がかかる。私はRを学び、ラップ家庭に精通していて、何とかここで使うことができるのだろうかと思っています。または、他の解決方法がある場合。私のコーディングのより速い解決策、ループを置き換える...?

私のソリューション:koに結果を希望

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) 
} 

返します。

+0

'rbind'呼び出しがここに最大のヒットである可能性が高いです。 'ko'をあらかじめ割り当てて行単位で入力する方が速いでしょう。 –

答えて

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 
関連する問題