【问题标题】:Subtract data from lat/lon coordinates从纬度/经度坐标中减去数据
【发布时间】:2017-07-20 23:03:45
【问题描述】:

我有 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 & modeldata$lat == : 条件的长度 > 1,并且只使用第一个元素

任何帮助将不胜感激!

【问题讨论】:

    标签: r if-statement dataframe latitude-longitude


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您可以使用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
      

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

      【讨论】:

      • 哦,看,我们的解决方案都有 3 行代码。 :)
      • @RomanLuštrik - 不要诱使我删除那些回车并将所有内容串联在一行上...... ;)
      • 在内心深处我们都会知道。
      【解决方案3】:

      这是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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多