从 lat/lon 坐标中减去数据
Subtract data from lat/lon coordinates
我有 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
我正在尝试减去匹配的 lat/long 组合(模型数据-观察数据)的计数,以便 78.75 和 21.25 的第一个组合给出 -8 的差异计数。任何没有匹配项的 lat/long 点都将被减去或从 0 中减去。
我尝试了一个 if 语句来匹配减法点:
if (modeldata$long == obsdata$long & modeldata$lat == obsdata$lat) {
obsdata$difference <- modeldata$count - obsdata$count
}
但是,这只是按顺序减去行,而不是按匹配点减去,除非匹配点恰好落在同一行内。
我也收到这些警告:
Warning messages:
1: In modeldata$long == obsdata$long :
longer object length is not a multiple of shorter object length
2: In modeldata$lat == obsdata$lat :
longer object length is not a multiple of shorter object length
3: In if (modeldata$long == obsdata$long & modeldata$lat == :
the condition has length > 1 and only the first element will be used
如有任何帮助,我们将不胜感激!
您可以使用 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
注意到加入坐标 (floats/decimals) 可能并不总是给出正确答案的明显警告
您可以合并坐标,为 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
这里有一个选项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
我有 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
我正在尝试减去匹配的 lat/long 组合(模型数据-观察数据)的计数,以便 78.75 和 21.25 的第一个组合给出 -8 的差异计数。任何没有匹配项的 lat/long 点都将被减去或从 0 中减去。
我尝试了一个 if 语句来匹配减法点:
if (modeldata$long == obsdata$long & modeldata$lat == obsdata$lat) {
obsdata$difference <- modeldata$count - obsdata$count
}
但是,这只是按顺序减去行,而不是按匹配点减去,除非匹配点恰好落在同一行内。
我也收到这些警告:
Warning messages:
1: In modeldata$long == obsdata$long : longer object length is not a multiple of shorter object length
2: In modeldata$lat == obsdata$lat : longer object length is not a multiple of shorter object length
3: In if (modeldata$long == obsdata$long & modeldata$lat == : the condition has length > 1 and only the first element will be used
如有任何帮助,我们将不胜感激!
您可以使用 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
注意到加入坐标 (floats/decimals) 可能并不总是给出正确答案的明显警告
您可以合并坐标,为 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
这里有一个选项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