You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中which()函数对比数值型tibble时失效问题求助

浮点数匹配异常:which()无法匹配lat列但all.equal返回TRUE

我需要将tibble对象dat中的数值填充到全量的dat2中,匹配规则是基于lon和lat列。但使用which()函数时,纬度匹配的条件始终返回integer(0),导致无法找到对应行。

数据背景

  • dat由raster::brick读取.nc文件后处理得到,已聚合为1x1度分辨率
  • 为匹配dat2的坐标:对dat$lon用ceiling(-179.5)处理,得到与dat2$V1一致的整数经度;对dat$lat加0.25,以匹配dat2$V2的纬度值
  • 确认两表中涉事列的类型均为numeric

涉事代码

which(dat$lon[k] == dat2$V1 & dat$lat[k] == dat2$V2)

单独测试dat$lon[k] == dat2$V1可正常返回匹配行,但dat$lat[k] == dat2$V2始终无匹配结果。

数据示例

dat表头

head(dat)
# A tibble: 6 × 3
    lon   lat    V3
  <dbl> <dbl> <dbl>
1   -82  76.5   179
2   -95  75.5     9
3   -94  75.5    44
4   -95  74.5    15
5   -94  74.5   177
6   -85  73.5   848

dat2表头

head(dat2)
# A tibble: 6 × 3
     V1    V2    V3
  <dbl> <dbl> <dbl>
1     0 -89.5     0
2     1 -89.5     0
3     2 -89.5     0
4     3 -89.5     0
5     4 -89.5     0
6     5 -89.5     0

对应行示例

dat第1行应匹配dat2第60039行:

dat2[60037:60040,]
# A tibble: 4 × 3
     V1    V2    V3
  <dbl> <dbl> <dbl>
60037   -84  76.5     0
60038   -83  76.5     0
60039   -82  76.5     0
60040   -81  76.5     0

已尝试的解决方案

  • 对dat$lat使用unlist()、as.numeric()强制转换类型
  • 尝试trimws()处理(虽无字符型数据)
  • 浮点数验证:all.equal(dat$lat[1], 76.5)、all.equal(dat2$V2[60039], 76.5)、all.equal(dat$lat[1], dat2$V2[60039])均返回TRUE,但which()仍无法匹配。

内容的提问来源于stack exchange,提问作者tannie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:32:59