如何基于df2的坐标提取df1中的预测值以对比预期与观测值
解决方法
你需要根据Lat和Long两个坐标列作为匹配键,把df1中的var1.predicted值对应到df2里,以下是几种可靠的实现方式:
方法1:Base R的merge函数
这是最基础的内置方法,无需额外安装包:
# 按Lat和Long匹配,只保留df2的所有行(all.x=TRUE) df_combined <- merge(df2, df1, by = c("Lat", "Long"), all.x = TRUE) # 把匹配到的var1.predicted重命名为Expected(可选) names(df_combined)[names(df_combined) == "var1.predicted"] <- "Expected"
方法2:tidyverse/dplyr的left_join
如果你习惯用tidyverse风格的代码,这个方法更直观:
# 先加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) df2 <- df2 %>% # 只保留df1中需要的匹配列和目标列 left_join(df1 %>% select(Lat, Long, var1.predicted), by = c("Lat", "Long")) %>% # 重命名列 rename(Expected = var1.predicted)
方法3:Base R的match索引
通过拼接坐标字符串生成匹配索引,适合对索引逻辑熟悉的用户:
# 生成坐标唯一标识字符串,用于匹配 df2_coords <- paste(df2$Lat, df2$Long, sep = "_") df1_coords <- paste(df1$Lat, df1$Long, sep = "_") # 找到df2坐标在df1中的位置索引 match_pos <- match(df2_coords, df1_coords) # 提取对应的值到df2 df2$Expected <- df1$var1.predicted[match_pos]
原代码报错原因
df1[as.matrix(df2)]的索引逻辑完全错误:as.matrix(df2)会把整个df2转换成数值矩阵,用它去索引df1时,R会把矩阵里的每个值当成行/列的位置编号,这和你要的"按坐标匹配"逻辑完全不符,自然会因为索引超出范围报错。
运行上述任意一种方法后,你的df2会得到预期结果:
| Lat | Long | observed | Expected |
|---|---|---|---|
| 1 | 3 | 0 | 0.8 |
| 2 | 4 | 1 | 0.9 |
内容的提问来源于stack exchange,提问作者KMont
相关产品推荐
相关产品推荐

