查找长度不等的数据框之间的最接近坐标

时间:2019-07-11 13:07:12

标签: r

我有两个大小不相等的数据帧,分别称为OBS和REF。两者都包含9864列-第1列和第2列是经度和纬度,第3-9864列是27年的每日温度值。它们的行数大不相同-OBS有12375,REF只有504。

OBS: 12375 obs. of 9864 variables

Lon     Lat     1979.01.01     1979.01.02     1979.01.03
0.000   39.75   13.69          13.14          13.32
1.000   39.75   12.93          12.41          12.59
2.000   39.75   11.78          10.62          11.15
3.000   39.75   11.73          10.94          12.16

REF: 504 obs. of 9864 variables

Lon      Lat       1979.01.01     1979.01.02     1979.01.03
0.0000   37.6559   12.69          12.35          12.60
2.8125   37.6559   13.43          12.97          13.23
5.6250   37.6559   13.91          13.64          13.71
8.4375   37.6559   14.12          14.24          14.01

我想做的是输出一个新的数据帧(REF_Closest),该数据帧从OBS数据帧中获取坐标,从REF数据帧中找到最接近的坐标,然后将这些坐标和所有变量输出到此右边,例如:

REF_Closest: 12375 obs. of 9864 variables

Lon      Lat       1979.01.01     1979.01.02     1979.01.03
0.0000   37.6559   12.69          12.35          12.60
0.0000   37.6559   12.69          12.35          12.60
2.8125   37.6559   13.43          12.97          13.23
2.8125   37.6559   13.43          12.97          13.23

我曾尝试适应其他类似问题,但无法解决。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我想出了一个data.table解决方案:

library(data.table)

# we will use this dummy variable to group by
ref[, id := 1:.N]

ref[, cbind(LonRef = Lon, 
      LatRef = Lat, 
      obs[which.min(as.matrix(dist(rbind(ref[.GRP, 1:2], 
                                         obs[, 1:2])))[2:(.N+1), 1]), ]), 
      by = id]

其中有什么:

  • cbind绑定三个不同来源的列:
    • Ref的lat
    • Ref的lon
    • 以及具有观察到的读数的data.frame(也有data.table)。
  • 该data.frame的计算如下:
    • dist计算从ref当前行(因此.GRP)到obs中所有纬度对的欧氏距离(因此{{1 }}。
    • 标识第一列的最小值,不包括其自身(对rbind进行修饰)
    • 返回(2:.N)的整行以获得这样的最小距离(即obs

之后,我获得了:

obs[...

我使用了数据:

   id LonRef  LatRef Lon   Lat 1979.01.01 1979.01.02 1979.01.03
1:  1 0.0000 37.6559   0 39.75      13.69      13.14      13.32
2:  2 2.8125 37.6559   3 39.75      11.73      10.94      12.16
3:  3 5.6250 37.6559   3 39.75      11.73      10.94      12.16
4:  4 8.4375 37.6559   3 39.75      11.73      10.94      12.16

答案 1 :(得分:0)

稍作改动-添加额外的一行=这将为您提供OBS中与REF的每一行都具有最近(欧几里德)距离的行号(即其多余的行)。

> REF
     Lon     Lat X1979.01.01 X1979.01.02 X1979.01.03
1 0.0000 37.6559       12.69       12.35       12.60
2 2.8125 37.6559       13.43       12.97       13.23
3 5.6250 37.6559       13.91       13.64       13.71
4 8.4375 37.6559       14.12       14.24       14.01
> OBS
  Lon   Lat X1979.01.01 X1979.01.02 X1979.01.03
1   0 39.75       13.69       13.14       13.32
2   1 39.75       12.93       12.41       12.59
3   2 39.75       11.78       10.62       11.15
4   3 39.75       11.73       10.94       12.16
5   8 38.50       12.34       14.23       17.23


nearest.rows <- apply (OBS,1, function(OBSrow) 
                       which.min(sqrt((OBSrow[1] - REF$Lon)^2 + (OBSrow[2] - REF$Lat)^2))
                      )

> nearest.rows
[1] 1 1 2 2 4