我有两个大小不相等的数据帧,分别称为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
我曾尝试适应其他类似问题,但无法解决。有什么建议吗?
答案 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
绑定三个不同来源的列:
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