将GPS信息提取为“静止”和“移动”状态

3

我有与 GPS 数据相关的问题。

我有一些数据看起来像这样:

enter image description here

我的问题是,我想从那些数据中提取信息到 value3 中,并将 value3 填充为 "steady" 和 "moving"。

根据纬度和经度的值,我们可以确定 "steady" 和 "moving"。但是,当我尝试绘制时我还是有些困惑。

例如:

35.1754255,126.9130674
35.1754281,126.9130184
35.1754225,126.9130536
35.1807405,126.9055772

绘图结果为: enter image description here 值1~3有些变化,但变化不大,所以可能将值3填入“稳定”,“短期变动”,“长期变动”,但我仍然不知道定义短期和长期的阈值。
我的第二个问题是如何使用R代码生成值3。实际上,我可以比较下一个值和当前值,如果不同就表示移动,如果相同就表示稳定,但我仍然对短期和长期移动感到困惑。
来自我的数据的dput()输出
> dput(loc)
structure(list(time = c("2014-06-30 08:26:36", "2014-06-30 08:31:30", 
"2014-06-30 08:36:30", "2014-06-30 08:41:30", "2014-06-30 08:46:30", 
"2014-06-30 08:51:30", "2014-06-30 08:56:31", "2014-06-30 09:01:30", 
"2014-06-30 09:06:30", "2014-06-30 09:11:30", "2014-06-30 09:16:30", 
"2014-06-30 09:21:30", "2014-06-30 09:26:30", "2014-06-30 09:31:30", 
"2014-06-30 09:36:30", "2014-06-30 09:41:30", "2014-06-30 09:46:30", 
"2014-06-30 09:51:52", "2014-06-30 09:56:30", "2014-06-30 10:01:30", 
"2014-06-30 10:06:53", "2014-06-30 10:11:30", "2014-06-30 10:16:52", 
"2014-06-30 10:21:30", "2014-06-30 10:26:30", "2014-06-30 10:31:30", 
"2014-06-30 10:36:51", "2014-06-30 10:41:30", "2014-06-30 10:46:54", 
"2014-06-30 10:51:51", "2014-06-30 10:57:30", "2014-06-30 11:01:51", 
"2014-06-30 11:06:30", "2014-06-30 11:11:51", "2014-06-30 11:16:30", 
"2014-06-30 11:21:51", "2014-06-30 11:26:30", "2014-06-30 11:31:30", 
"2014-06-30 11:36:52", "2014-06-30 11:41:30", "2014-06-30 11:46:51", 
"2014-06-30 11:51:30", "2014-06-30 11:56:53", "2014-06-30 12:01:32", 
"2014-06-30 12:07:30", "2014-06-30 12:11:51", "2014-06-30 12:16:33", 
"2014-06-30 12:21:30", "2014-06-30 12:26:30", "2014-06-30 12:31:51", 
"2014-06-30 12:36:30", "2014-06-30 12:41:36", "2014-06-30 12:46:30", 
"2014-06-30 12:52:10", "2014-06-30 12:56:30", "2014-06-30 13:01:30", 
"2014-06-30 13:06:30", "2014-06-30 13:11:30", "2014-06-30 13:16:30", 
"2014-06-30 13:21:30", "2014-06-30 13:26:30", "2014-06-30 13:31:30", 
"2014-06-30 13:36:30", "2014-06-30 13:41:30", "2014-06-30 13:46:30", 
"2014-06-30 13:51:30", "2014-06-30 13:56:30", "2014-06-30 14:01:30", 
"2014-06-30 14:06:55", "2014-06-30 14:11:19", "2014-06-30 14:16:19", 
"2014-06-30 14:21:19", "2014-06-30 14:26:19", "2014-06-30 14:31:19", 
"2014-06-30 14:36:19", "2014-06-30 14:41:19", "2014-06-30 14:46:19", 
"2014-06-30 14:51:19", "2014-06-30 14:56:19", "2014-06-30 15:01:19", 
"2014-06-30 15:06:19", "2014-06-30 15:11:19", "2014-06-30 15:16:19", 
"2014-06-30 15:21:19", "2014-06-30 15:26:19", "2014-06-30 15:31:19", 
"2014-06-30 15:36:19", "2014-06-30 15:41:19", "2014-06-30 15:46:19", 
"2014-06-30 15:51:19", "2014-06-30 15:56:19", "2014-06-30 16:01:19", 
"2014-06-30 16:06:19", "2014-06-30 16:11:19", "2014-06-30 16:16:20", 
"2014-06-30 16:21:19", "2014-06-30 16:26:19", "2014-06-30 16:31:19", 
"2014-06-30 16:36:19", "2014-06-30 16:41:19"), type = c("location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location", "location", "location", "location", 
"location", "location", "location"), value1 = c("35.1754255", 
"35.1754281", "35.1754225", "35.1753982", "35.1753991", "35.1753997", 
"35.1754333", "35.1754143", "35.1754126", "35.1754142", "35.1753987", 
"35.1754178", "35.1754176", "35.1753914", "35.1754066", "35.1753833", 
"35.1753883", "35.174465", "35.174465", "35.1735813", "35.1744781", 
"35.1735813", "35.174502", "35.1749091", "35.1749091", "35.1749091", 
"35.1744991", "35.1749091", "35.1751931", "35.1748972", "35.1755879", 
"35.1759928", "35.1759928", "35.1763946", "35.1763946", "35.1763882", 
"35.1763882", "35.1762131", "35.1760547", "35.1760547", "35.1774352", 
"35.1774352", "35.1785821", "35.1785821", "35.1773562", "35.1807058", 
"35.1807058", "35.1813436", "35.1802903", "35.1807615", "35.1807615", 
"35.1807405", "35.1807405", "35.1805536", "35.1805536", "35.1808169", 
"35.1797636", "35.1836812", "35.1836812", "35.1897643", "35.1898214", 
"35.1897615", "35.1897765", "35.1897157", "35.1896921", "35.1897299", 
"35.18975", "35.1897503", "35.1897673", "35.1897539", "35.1897932", 
"35.1897702", "35.1897627", "35.189763", "35.1897438", "35.1898021", 
"35.1897853", "35.1897405", "35.1897803", "35.1897844", "35.1897624", 
"35.1897769", "35.1897656", "35.1897265", "35.1897488", "35.1897599", 
"35.1897477", "35.1897951", "35.189759", "35.1897624", "35.1897692", 
"35.1898468", "35.1897727", "35.1897624", "35.1897958", "35.189817", 
"35.1897391", "35.1897317", "35.189745", "35.1897624"), value2 = c("126.9130674", 
"126.9130184", "126.9130536", "126.9130597", "126.9130549", "126.9130598", 
"126.9130484", "126.9130638", "126.9130687", "126.9130553", "126.913074", 
"126.9130686", "126.9130779", "126.9130496", "126.9130196", "126.9130507", 
"126.9130474", "126.9135807", "126.9135807", "126.9119189", "126.9137426", 
"126.9119189", "126.9137499", "126.9124954", "126.9124954", "126.9124954", 
"126.9137861", "126.9124954", "126.9142743", "126.9118689", "126.912267", 
"126.9131502", "126.9131502", "126.9130495", "126.9130495", "126.9131069", 
"126.9131069", "126.911819", "126.9121906", "126.9121906", "126.9123621", 
"126.9123621", "126.9093961", "126.9093961", "126.9041179", "126.9055765", 
"126.9055765", "126.904599", "126.9054961", "126.905568", "126.905568", 
"126.9055772", "126.9055772", "126.9052718", "126.9052718", "126.9050475", 
"126.9059447", "126.9052348", "126.9052348", "126.9063181", "126.9062802", 
"126.9063452", "126.9064237", "126.9065031", "126.9065168", "126.9063599", 
"126.9064195", "126.9064469", "126.9063441", "126.9063828", "126.9064423", 
"126.9063459", "126.9063602", "126.9063096", "126.9063355", "126.9063742", 
"126.9063253", "126.9063123", "126.9063434", "126.9063729", "126.906397", 
"126.9063288", "126.906282", "126.9062903", "126.9063502", "126.9063432", 
"126.9063004", "126.9063742", "126.9063343", "126.9063969", "126.9062847", 
"126.9063212", "126.9063034", "126.9063969", "126.9063237", "126.906375", 
"126.9063572", "126.9063514", "126.9062548", "126.906397"), value3 = c("", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
"", "", "")), .Names = c("time", "type", "value1", "value2", 
"value3"), row.names = c(NA, 100L), class = "data.frame")

也许你想要将某些数字四舍五入?不确定你想要将几位数进行四舍五入。但是,通过一些计算,你可以找到答案,我想。 - jazzurro
@jazzurro,我对地理空间数据一无所知,舍入是否可以,你知道我应该使用多少位数来四舍五入吗? - user46543
@rawr 实际上这两个问题很相似,我想要用稳定、短期移动和长期移动来填充列值3,但我仍然不确定如何定义短期和长期移动。 - user46543
@user46543,你想定义“长”和“短”的方式似乎是你自己的选择。我只是认为,由于GPS的一些误差,很难看到完全相同的地理编码。我还有印象你不希望出现“微小的移动”。但是,看起来你想将移动分类为三类。是这样吗? - jazzurro
@jazzurro 是的,有没有一种了解小运动和长运动的方式,也就是处理空间数据的库? - user46543
1个回答

2
这是我的尝试。正如我在上面的评论中提到的,您需要自己定义“短距离移动”和“长距离移动”。在R中,您可以使用dplyr包中的lag()函数来计算移动。我可能错了,但1度约为111.32公里。因此,0.0001度约为11米。在这个尝试中,如果这个人在经度和纬度上移动超过11米但不到55米,我认为这是“小移动”。任何更长的移动都被视为“长移动”。由于我不是gis专业人士,我的方法可能不合适。但是,我希望这能给您一些想法。

P.S. 如果您有大量数据,则ifelse()会减慢处理速度。您应该考虑使用data.table包。

# Note: 1 degree = 111.32 km
#0.0001 degree  11.1132 m

# Convert character to numeric
mydf$value1 <- as.numeric(mydf$value1)
mydf$value2 <- as.numeric(mydf$value2)

library(dplyr)
select(mydf, -type, -value3) %>%
mutate(movement = ifelse(value1 == lag(value1) & value2 == lag(value2), "same",
                      ifelse(between(abs(value1 - lag(value1)), 0.0001, 0.0005) == TRUE &
                             between(abs(value2 - lag(value2)), 0.0001, 0.0005) == TRUE, "little", "long")))

# A part of the outcome
#33  2014-06-30 11:06:30 35.175993 126.91315     same
#34  2014-06-30 11:11:51 35.176395 126.91305   little
#35  2014-06-30 11:16:30 35.176395 126.91305     same
#36  2014-06-30 11:21:51 35.176388 126.91311     long
#37  2014-06-30 11:26:30 35.176388 126.91311     same
#38  2014-06-30 11:31:30 35.176213 126.91182     long
#39  2014-06-30 11:36:52 35.176055 126.91219   little
#40  2014-06-30 11:41:30 35.176055 126.91219     same
#41  2014-06-30 11:46:51 35.177435 126.91236     long
#42  2014-06-30 11:51:30 35.177435 126.91236     same

谢谢您的回答,我还没有使用过dplyr,您的代码中是否有什么遗漏?我无法在我的R studio中运行您的代码,控制台仍然要求输入其他命令,即“+ .....”。 - user46543
好的,我可以运行它,只是缺少 ")"。 - user46543
@user46543 对不起,我很抱歉。 - jazzurro
@user46543 我修改了代码,现在比原来的快了。 - jazzurro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接