【问题标题】:dplyr - error message after applying functiondplyr - 应用函数后的错误消息
【发布时间】:2015-07-21 07:34:33
【问题描述】:

我正在尝试将 IDW(反距离加权)应用于数据库中的不同组。我正在尝试使用 dplyr 将此功能应用于每个组,但我在 Split-Apply-Combine 中犯了一个错误。当前函数为每组 10 个观察值返回 10 个值,但当前 dplyr 尝试在每个变异单元格中插入 10 个返回值,而不是为变异单元格插入一个新值。

问题可能与函数无关,但很遗憾我找不到显示相同错误的更简单函数。

我收到数据框已损坏的错误消息,并且新列已填充值。

   group N      Lat     Long Obs   idw_val
1      A 1 49.43952 20.42646  11 <dbl[10]>
2      B 1 49.76982 19.70493   8 <dbl[10]>

该示例有望阐明这一点。解决方案可能非常简单 - 一些可以帮助我的指针非常感谢......

require(ggmap)
require(dplyr)
require(raster)
require(sp)
require(gstat)
require(lattice)

####create dataset
set.seed(123)
dh = expand.grid(group = c("A","B","C"),
                 N=1:10)

dh$Lat=rnorm(nrow(dh),50,1)
dh$Long=rnorm(nrow(dh),20,1)
dh$Obs=rpois(nrow(dh),10)
dh

#####create grid
pixels <- 10

#####function defintion 
idw_w=function(x,y,z){

  geog2 <- data.frame(x,y,z)
  coordinates(geog2) = ~x+y

  geog.grd <- expand.grid(x=seq(floor(min(coordinates(geog2)[,1])),
                                ceiling(max(coordinates(geog2)[,1])),
                                length.out=pixels),
                          y=seq(floor(min(coordinates(geog2)[,2])),
                                ceiling(max(coordinates(geog2)[,2])),
                                length.out=pixels))

# Assigning coordinates results in spdataframe.
  grd.pts <- SpatialPixels(SpatialPoints((geog.grd)))
  grd <- as(grd.pts, "SpatialGrid")

##### IDW interpolation.
  geog2.idw <- idw(z ~ 1, geog2, grd, idp=4)

####overlay
  pts <- SpatialPoints(cbind(x, y))
  over(pts, geog2.idw["var1.pred"])
}

#### test function
idw_w(dh$Lat,dh$Long,dh$Obs)

####groupwise dplyr
dh2 = dh %>%
  #   arrange(Block, Species, Date) %>%
  group_by(group) %>%
  mutate(idw_val=idw_w(x=Lat,y=Long,z=Obs)) 

dh2
str(dh2)

【问题讨论】:

    标签: r apply spatial dplyr


    【解决方案1】:

    如果我正确理解您想要什么,只需确保您的函数返回值向量而不是 data.frame 对象。我认为这个函数在运行mutate() 步骤时会做你想做的事:

    idw_w=function(x,y,z){
    
      geog2 <- data.frame(x,y,z)
      coordinates(geog2) = ~x+y
    
      geog.grd <- expand.grid(x=seq(floor(min(coordinates(geog2)[,1])),
                                    ceiling(max(coordinates(geog2)[,1])),
                                    length.out=pixels),
                              y=seq(floor(min(coordinates(geog2)[,2])),
                                    ceiling(max(coordinates(geog2)[,2])),
                                    length.out=pixels))
    
    # Assigning coordinates results in spdataframe.
      grd.pts <- SpatialPixels(SpatialPoints((geog.grd)))
      grd <- as(grd.pts, "SpatialGrid")
    
    ##### IDW interpolation.
      geog2.idw <- idw(z ~ 1, geog2, grd, idp=4)
    
    ####overlay
      pts <- SpatialPoints(cbind(x, y))
      (over(pts, geog2.idw["var1.pred"]))[,1]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2021-11-14
      • 1970-01-01
      • 2016-04-07
      • 2018-05-12
      • 2020-09-01
      • 2014-05-13
      相关资源
      最近更新 更多