r语言 - 从纬度/纬度坐标中减去数据



我有 2 个数据文件,如下所示:

Model Data
long  lat   count
96.25 18.75     4
78.75 21.25     3
86.75 23.25     7
91.25 33.75     10
Observation Data
long  lat   count
96.75 25.75    10
86.75 23.25     7
78.75 21.25    11
95.25 30.25     5

我正在尝试减去匹配的经度/经度组合(模型数据观察数据(的计数,以便 78.75 和 21.25 的第一个组合将给出 -8 的差异计数。任何没有匹配项的经度/经度点都会被减去或从 0 中减去。

我尝试过这样的 if 语句来匹配减法点:

if (modeldata$long == obsdata$long & modeldata$lat == obsdata$lat) {
obsdata$difference <- modeldata$count - obsdata$count
}

但是,这只是按顺序减去行,而不是按匹配点减去,除非匹配的点恰好在同一行中。

我也收到以下警告:

警告消息:

1:在模型中数据$long == obsdata$long : 较长的对象长度不是较短对象长度的倍数

2: In modeldata$lat == obsdata$lat : 较长的对象长度不是较短对象长度的倍数

3: In if (modeldata$long ==obsdata$long & modeldata$lat == : 条件的长度> 1,并且仅使用第一个元素

任何帮助将不胜感激!

您可以在坐标上合并,为 NA 添加 0 并减去。

mdl <- read.table(text = "long  lat   count
96.25 18.75     4
78.75 21.25     3
86.75 23.25     7
91.25 33.75     10", header = TRUE)
obs <- read.table(text = "long  lat   count
96.75 25.75    10
86.75 23.25     7
78.75 21.25    11
95.25 30.25     5", header = TRUE)
xy <- merge(mdl, obs, by = c("long", "lat"), all.x = TRUE)
xy[is.na(xy)] <- 0
xy$diff <- xy$count.x - xy$count.y
xy
long   lat count.x count.y diff
1 78.75 21.25       3      11   -8
2 86.75 23.25       7       7    0
3 91.25 33.75      10       0   10
4 96.25 18.75       4       0    4

您可以使用data.table加入和更新来执行此操作

library(data.table)
## reading your supplied data
# dt_model <- fread(
#   'long  lat   count
# 96.25 18.75     4
#   78.75 21.25     3
#   86.75 23.25     7
#   91.25 33.75     10'
# )
# 
# 
# dt_obs <- fread(
# "long  lat   count
#   96.75 25.75    10
#   86.75 23.25     7
#   78.75 21.25    11
#   95.25 30.25     5"
# )
setDT(dt_model)
setDT(dt_obs)
## this join & update will update the `dt_model`. 
dt_model[ 
dt_obs
, on = c("long", "lat")
, count := count - i.count
]
dt_model
#     long   lat count
# 1: 96.25 18.75     4
# 2: 78.75 21.25    -8
# 3: 86.75 23.25     0
# 4: 91.25 33.75    10

注意一个明显的警告,即在坐标(浮点数/小数(上连接可能并不总是给出正确的答案

这是一个带有dplyr的选项

library(dplyr)
left_join(mdl, obs, by = c("long", "lat")) %>%
transmute(long, lat, count = count.x - replace(count.y, is.na(count.y), 0))
#   long   lat count
#1 96.25 18.75     4
#2 78.75 21.25    -8
#3 86.75 23.25     0
#4 91.25 33.75    10

最新更新