如何解决在对previos和下一项进行操作时,遍历data.table
我有许多GPS点。
points <- structure(list(counter = 1:6,lon = c(11.8300715,11.8296697,11.8268708,11.8267236,11.8249612,11.8251062),lat = c(48.1099048,48.10884,48.1067431,48.1066077,48.1037673,48.103318),dist = c(46.8463805878941,33.4921440879536,10.6101735030534,18.6085009578724,6.97253109610173,9.8912817449265)),row.names = c(NA,-6L),class = c("data.table","data.frame"))
我想使跟踪顺利进行。 为此,我想应用以下计算
points[n].latitude = points[n-1].latitude * 0.3 + points[n].latitude * .4 + points[n+1].latitude * .3
points[n].longitude = points[n-1].longitude * 0.3 + points[n].longitude * .4 + points[n+1].longitude * .3
所以基本上我需要遍历结构并将操作应用于previos和下一个条目。 最好的方法是什么?我想避免for循环。 谢谢你的建议。
解决方法
尝试此技巧:
library(data.table)
cols <- c("lon","lat")
mysmooth <- function(z,wts = c(0.3,0.4,0.3)) { notna <- !is.na(z); sum(z[notna] * wts[notna]) / sum(wts[notna]); }
points[,(cols) := lapply(.SD,function(z) zoo::rollapply(c(NA,z,NA),3,mysmooth)),.SDcols = cols]
points
# counter lon lat dist
# 1: 1 11.82990 48.10945 46.846381
# 2: 2 11.82895 48.10853 33.492144
# 3: 3 11.82767 48.10733 10.610174
# 4: 4 11.82624 48.10580 18.608501
# 5: 5 11.82553 48.10448 6.972531
# 6: 6 11.82504 48.10351 9.891282
c(NA,NA)
的目的是以某种方式处理部分向量。默认情况下,zoo::rollapply
可以:
-
partial=FALSE
将导致返回向量比源向量短,因为它仅使用 full 窗口。在带有k=3
的数据中,这会导致左侧丢失一个值,右侧丢失一个值(假设align="center"
);或 -
partial=TRUE
向该函数发送长度小于3的向量。发生这种情况时,我假设您的函数将为(value[n]*0.4 * value[n+1]*0.3)/0.7
(右侧类似)。
我应该补充一点,因为我进行了部分加权平均,所以端点平滑将向内偏移。
,您所需要做的就是使用内置移位功能执行计算
setDT(points)[,(latitude.new) := shift(latitude,type='lag')*0.3 +
latitude * 0.4 +
shift(latitude,type='lead')*3,]
有关更多信息,请参见此处How to create a lag variable within each group?。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。