从纬度/经度坐标中减去数据

时间:2017-07-20 23:03:45

标签: r if-statement dataframe latitude-longitude

我有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减去或从0减去。

我已尝试使用if语句来匹配减法点:

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

然而,这只是按顺序减去行,而不是通过匹配点,除非匹配点恰好落在同一行内。

我也收到了这些警告:

  

警告讯息:

     

1:在modeldata $ long == obsdata $ long:         较长的物体长度不是较短物体长度的倍数

     

2:在modeldata $ lat == obsdata $ lat:         较长的物体长度不是较短物体长度的倍数

     

3:在if(modeldata $ long == obsdata $ long&amp; modeldata $ lat ==:         条件的长度> 1,只使用第一个元素

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

您可以合并坐标,为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

答案 1 :(得分:2)

您可以使用data.table加入&amp;更新

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

注意到加入坐标(浮点数/小数)可能并不总是给出正确答案的明显警告

答案 2 :(得分:2)

以下是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