2015-09-27 26 views
0

我想使用dplyr來計算一組lon/lat/timestamp座標的日出時間,使用maptools的sunriset函數。這是一個可重現的例子。使用maptools :: sunriset()內部變異

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) 

當我運行這段代碼,我得到的錯誤

"Error: invalid subscript type 'closure'"

我猜這意味着我沒有通過變量引入sunriset正確。

這種方法做的工作,如果我做沒有dplyr

pts$sunrise<-sunriset(as.matrix(select(pts,lon,lat)), 
        pts$timestamp, POSIXct.out=T, 
        direction='sunrise')$time 

不過,我有大量的行(約65億美元)和上面的方法實在是太慢了,即使有一個小部分。我希望dplyr會更快。如果有人對哪種方法可能最快有其他建議,我很樂意聽到他們。

+1

您可以使用data.table嘗試以下操作。 setDT(pts)[,日出:= sunriset(矩陣(c(lon,lat),ncol = 2,nrow = 6,byrow = FALSE),timestamp,POSIXct.out = T,direction ='sunrise')[2 ]] []' – jazzurro

+1

矩陣副本(+ sunriset不是C/C++支持的事實)真的是花時間@jazzurro(我擴展了我的答案)。 – hrbrmstr

+1

@hrbrmstr我明白了。在這種情況下,使用dplyr或data.table將不會加快此過程。感謝您的信息。 :) – jazzurro

回答

2
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)) 

是處理的一種方式(並具有清潔mutate管道的副作用),但我不知道爲什麼你認爲它會更快。無論哪種方式,瓶頸(最有可能)是創建用於調用sunriset的矩陣,這將以任何方式發生。

maptools源是很容易去通過,並具有非導出函數maptools:::.sunrisetUTC(),做:

".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. 

你可以嘗試做合格的儒略日,經度,緯度&方向它VS的導出功能以避免數據複製。但是,如果性能很關鍵,我會使用Rcpp來編寫一個基於this的內聯向量化C/C++函數。

+1

hrbrmstr,謝謝你的信息。到目前爲止,我的使用一直是一次性的,我已經能夠忍受性能問題。如果我需要在一致的基礎上實現快速性能,我會嘗試一下您的建議。 如果有人讀到這個,我碰到這個代碼:http://stjarnhimlen.se/comp/sunriset.c 它看起來是一個sunriset函數在c中的實現 –