我正在建立一个随机模型来预测漂浮在海洋中的物体的运动。我有来自世界各地的漂流浮标的数千个数据。格式如下:
index month year lat long
72615 10 2010 35,278 129,629
72615 11 2010 37,604 136,365
72615 12 2010 39,404 137,775
72615 1 2011 39,281 138,235
72620 1 2011 35,892 132,766
72620 2 2011 38,83 133,893
72620 3 2011 39,638 135,513
72620 4 2011 41,297 139,448
该模型的一般概念是将整个世界划分为大小为5x5度的2592个单元格。然后使用公式
创建马尔可夫链转移矩阵1个月内从小区i到小区j的概率等于:
1个月内任何浮标从小区i到小区j的次数
除以
任何浮标出口的次数(包括从i到i)。
但是我有两个与管理数据相关的麻烦。
1。是否有一个简单的解决方案(最好是在Excel或R中)将第6列添加到数据集中,其值仅取决于纬度和经度的值,因此它将等于:
当纬度和经度都在0到5之间1
2当纬度介于0和5之间,经度介于5和10之间时
3当纬度在0和5之间,经度在10到15之间时
依此类推,最高可达数字2592
2。是否有一种简单的方法可以计算1个月内任何浮标从单元格i到单元格j的次数?
我试图在Excel中找出问题1的解决方案,但想到的不仅仅是按纬度/经度列排序然后手动编写值。
我也被告知R对于管理这些数据集要好得多,但我对它没有经验并且自己找不到解决方案。
我真的很感激任何帮助。
答案 0 :(得分:1)
有人可能会提出更复杂/更快的东西,但这是一种粗略的方法,具有相对容易理解的好处。
示例数据:
dd <- read.table(header=TRUE,dec=",",text="
index month year lat long
72615 10 2010 35,278 129,629
72615 11 2010 37,604 136,365
72615 12 2010 39,404 137,775
72615 1 2011 39,281 138,235
72620 1 2011 35,892 132,766
72620 2 2011 38,83 133,893
72620 3 2011 39,638 135,513
72620 4 2011 41,297 139,448")
为(0-5)生成等于1的索引,为(6-10)生成2等等
dd$x <- (dd$lat %/% 5) + 1
dd$y <- (dd$long %/% 5) + 1
设置一个空矩阵(不确定我的行/列是否正确)
mm <- matrix(0,nrow=36,ncol=72)
(为了清楚起见,您可能希望在此处使用dimnames
参数)
填写:
for (i in 1:nrow(dd)) {
mm[dd[i,"x"],dd[i,"y"]] <- mm[dd[i,"x"],dd[i,"y"]]+1
}
如果您只有几千行,这可能足够快。我会尝试一下,看看你是否需要更高级的东西。 (如果您需要将矩阵折叠回一组列,可以使用reshape2::melt
或tidyr::gather
...)