【发布时间】:2015-09-28 00:19:10
【问题描述】:
我正在尝试使用 dplyr 来计算一组 lon/lat/timestamp 坐标的日出时间,使用 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)
当我运行这段代码时,我得到了错误
“错误:无效的下标类型‘闭包’”
我猜这意味着我没有正确地将变量传递给sunriset。
如果我不使用dplyr,此方法确实有效
pts$sunrise<-sunriset(as.matrix(select(pts,lon,lat)),
pts$timestamp, POSIXct.out=T,
direction='sunrise')$time
但是,我有很多行(大约 6500 万行),即使只有一小部分,上述方法也非常慢。我希望 dplyr 会更快。如果有人对最快的方法有其他建议,我很想听听。
【问题讨论】:
-
您可以使用 data.table 尝试以下操作。
setDT(pts)[,sunrise := sunriset(matrix(c(lon, lat), ncol = 2, nrow = 6, byrow = FALSE), timestamp, POSIXct.out=T, direction='sunrise')[2]][] -
矩阵副本(+
sunriset不是 C/C++ 支持的事实)可能是 @jazzurro 花费时间的事情(我扩展了我的答案)。 -
@hrbrmstr 我明白了。在这种情况下,使用 dplyr 或 data.table 不会加快这个过程。谢谢提供信息。 :)