2017-03-06 4 views
2

私は異なる時点で異なるIDのxy座標を持つ2つのデータフレームを持っています。私がしたいのは、前年のどの点が今年の点に最も近いかを特定し、そのデータをリストに格納することです。したがって、この例のデータのために:私は(下記のように)適用使ってこれを実行しようとしているが、でてきた異なるポイントのリストに最も近いポイントを特定し、そのIDをリストに格納するにはどうすればいいですか

names closest 
D  A 
E  B 
F  C 

oldnames <- c('A', 'B', 'C') 
oldx <- c(0,5,10) 
oldy <- c(0,5,10) 
olddf <- data.frame(oldnames, oldx, oldy) 

newnames <- c('D','E','F') 
newx <- c(1, 6, 11) 
newy <- c(1, 6, 11) 
newdf <- data.frame(newnames, newx, newy) 

私はこのようになりますリストを作成したいと思います瞬時にエラーメッセージが表示されます: (mutate_impl(.data、dots)のエラー: バイナリ演算子に数値以外の引数)

誰にもアイデアはありますか?

closestdf <- data.frame() 
apply(newdf, 1, function(row) { 
    name <- row["names"] 
    xID <- row["x"] 
    yID <- row["y"] 
    closest <- olddf %>% 
       mutate(length = sqrt((xID - oldx)^2 + (yID - oldy)^2)) %>% 
       mutate(rank = min_rank(length)) %>% 
       filter(rank == '1')%>% 
       mutate(total = '1') 
       closestdf <- rbind(closest, closestdf) 
}) 

乾杯!

答えて

2

呼び出しを適用するための必要がありません、我々は代わりにmutate内部purrrことができます。

library(tidyverse) 
newdf %>% 
    mutate(closest = 
      map2_chr(newx, newy, 
        ~as.character(olddf$oldnames)[which.min((.x - olddf$oldx)^2 + (.y - olddf$oldy)^2)] 
      ) 
) 

は与える:

newnames newx newy closest 
1  D 1 1  A 
2  E 6 6  B 
3  F 11 101  C 

場合平方根演算を実行する理由はありません、我々実際の距離は必要ありません。中間段階で、より明確かつ詳細な

または:

newdf %>% 
    mutate(dists = map2(newx, newy, ~(.x - olddf$oldx)^2 + (.y - olddf$oldy)^2), 
     ids = map_dbl(dists, which.min), 
     closest = olddf$oldnames[ids]) 

は与える:そのため

newnames newx newy    dists ids closest 
1  D 1 1  2, 32, 162 1  A 
2  E 6 6   72, 2, 32 2  B 
3  F 11 101 10322, 9252, 8282 3  C 
+1

大感謝を!トップソリューションの場合は、代わりに[which.min((。x - olddf $ oldx^2)+(.y - olddf $ oldy)^ 2)]とする必要がありますか? –

+1

はい、申し訳ありませんが、私は速すぎました。 – Axeman

関連する問題