Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mutate中使用maptools::sunriset()_R_Dplyr_Maptools - Fatal编程技术网

在mutate中使用maptools::sunriset()

在mutate中使用maptools::sunriset(),r,dplyr,maptools,R,Dplyr,Maptools,我试图使用maptools中的sunriset函数,使用dplyr计算一组lon/lat/timestamp坐标的日出时间。这是一个可复制的例子 library(maptools) library(dplyr) pts <- tbl_df(data.frame( lon=c(12.08752,12.08748,12.08754,12.08760,12.08746,12.08748), lat=c(52.11760,52.11760,52.11747,52.11755,52.117

我试图使用maptools中的
sunriset
函数,使用
dplyr
计算一组lon/lat/timestamp坐标的日出时间。这是一个可复制的例子

library(maptools)
library(dplyr)

pts <- tbl_df(data.frame(
  lon=c(12.08752,12.08748,12.08754,12.08760,12.08746,12.08748),
  lat=c(52.11760,52.11760,52.11747,52.11755,52.11778,52.11753),
  timestamp=as.POSIXct(
    c("2011-08-12 02:00:56 UTC","2011-08-12 02:20:22 UTC",
      "2011-08-12 02:40:15 UTC","2011-08-12 03:00:29 UTC",
      "2011-08-12 03:20:26 UTC","2011-08-12 03:40:30 UTC"))
))

pts %>% mutate(sunrise=sunriset(as.matrix(lon,lat),
                                timestamp,POSIXct.out=T,
                                direction='sunrise')$time)
然而,我有很多行(大约6500万行),上面的方法非常慢,即使只有一小部分。我希望dplyr会更快。如果有人对哪种方法最快有其他建议,我很乐意听听

sunr <- function(lon, lat, ts, dir='sunrise') {
  # can also do matrix(c(pts$lon, pts$lat), ncol=2, byrow=TRUE) vs 
  # as.matrix(data.frame…
  sunriset(as.matrix(data.frame(lon, lat)), ts, POSIXct.out=TRUE, direction=dir)$time
}

pts %>% mutate(sunrise = sunr(lon, lat, timestamp))

您可以尝试将julian day、lon、lat和direction传递给导出的函数,以避免数据复制。但是,如果性能非常关键,我会使用
Rcpp
编写一个基于的内联向量化C/C++函数。

您可以使用data.table尝试以下操作<代码>setDT(pts)[,sunrise:=sunriset(矩阵(c(lon,lat),ncol=2,nrow=6,byrow=FALSE),时间戳,POSIXct.out=T,direction='sunrise')[2]]][矩阵副本(+code>sunriset不是c/c++)很可能是花时间的事情,我扩展了我的答案。@hrbrmstr。在这种情况下,使用dplyr或data.table将不会加快那么多进程。谢谢你提供的信息。:)hrbrmstr,谢谢你提供的信息。到目前为止,我的使用是一次性的,我能够忍受性能问题。我会尝试你的建议,以防我需要在一致的基础上有快速的表现。如果anbody其他人读到了这段代码,我偶然发现了这段代码:它似乎是c中sunriset函数的一个实现
sunr <- function(lon, lat, ts, dir='sunrise') {
  # can also do matrix(c(pts$lon, pts$lat), ncol=2, byrow=TRUE) vs 
  # as.matrix(data.frame…
  sunriset(as.matrix(data.frame(lon, lat)), ts, POSIXct.out=TRUE, direction=dir)$time
}

pts %>% mutate(sunrise = sunr(lon, lat, timestamp))
".sunrisetUTC" <- function(jd, lon, lat, direction=c("sunrise", "sunset")) {
## Value: Numeric, UTC time of sunrise or sunset, in minutes from zero
## Z.
## --------------------------------------------------------------------
## Arguments: jd=julian day (real);
## lon=lat=longitude and latitude, respectively, of the observer in
## degrees;
## sunrise=logical indicating whether sunrise or sunset UTC should be
## returned.