首先,对这个冗长的介绍感到抱歉,但是我认为这将有助于更好地理解问题。我正在做一个项目,我们正在尝试利用巨大的浮动汽车数据来推断人类的出行方式。我正在使用RStudio这样做。基本上,我们有两个文件; trips.csv ,其中包含375,000次行程,其中包含行程ID,起点/终点位置(经度,纬度)和其他字段等元数据。第二个文件是 waypoints.csv ,其中包含完整的GPS航点数据,并按行程列出。这包括航点顺序,位置和其他字段。
这37.5万次旅行(第一个文件)总共有近一千万个航点(第二个文件)。因此,从第一个文件开始的每个行程在第二个文件中都有多个航点,共同构成了该行程的轨迹。下表显示了每个文件中的示例,其中仅包含我在问题中所需的列:
旅行数据
Tripld,Lon1,Lat1,Lon2,Lat2,distance,
bb983d,11.565,48.19,11.55,48.143,7498,
da5bgg,11.584,48.157,11.639,48.098,1364,
saefeg,11.591,48.142,11. 563,48.18,7377
航点数据
TripId,sequence,Lon,Lat,
bb983d,0,11.565,48.19,
bb983d,1,11.56688,48.18158,
bb983d,2,11.56351,48.18144,
bb983d,3,11.56335,48.1888,
bb983d,4,11.5654,48.17617,
da5bgg,0,11.584,48.157,
da5bgg,1,11.583417,48.155167,
da5bgg,2,11.578472,48.144556,
da5bgg,3,11.57075,48.142139,
5aefeg,0,11.591,48.142,
5aefeg,1,11.58994,4813956
5aefeg,2,11.58797,48.13706
这是我用来制作数据框的代码:
dput(droplevels(head(trips)))structure(list(TripId = structure(1:6, .Label = c("00a7da9f4b503f36fc937f386b11ca58", "00aa3cb70345798d9b1d92bc4685b3ee", "017cb0697a1135c5cd3479c1edc2aa6b", "01cc30aa0e036817cf4bdc468c9fad8a", "01f0a6a90ec964ae8014d2f750231663", "02949197deca3f1d52906cfc147454c5"), class = "factor"), StartLocLat = c(48.178, 48.098, 48.15, 48.176, 48.149, 48.151), startLocLon = c(11.573, 11.501, 11.503, 11.558, 11.503, 11.563), EndLocLat = (48.143, 48.098, 48.18, 48.168, 48.148, 48.127), EndLocLon = c(11.55, 11.639, 11.563, 11.526, 11.616, 11.554)), row.names = c(NA, 6L), class = "data.frame")
dput(droplevels(head(waypoints))) structure(list(TripId = structure(c(1L, 1L, 1L, 1L, 1L, 2L), .Label = c ("00a7da9f4b503f36fc937f386b11ca58", "00aa3cb70345798d9b1d92bc4685b3ee"), class = "factor"), Sequence = c(0L, 1L, 2L, 3L, 4L, 0L), Latitude = c(48.178, 48.18158, 48.18144, 48.1808, 48.17617, 48.098), Longitude = c(11.573, 11.56688, 11.56351, 11.56335, 11.5654, 11.501)), row.names = c(NA, 6L), class = "data.frame")
现在,我想添加一列偏差区域,该列表示虚拟直线从起点到每个行程的终点,以及实际路径或轨迹,是通过该行程的线段连接航路点(顺序)而产生的。
随附的照片可能有助于了解相应的区域:
我进行了快速研究,但没有找到我真正需要的东西,尤其是在所有旅行中都需要这样做。
任何带有代码的提示/建议-如果可能的话-将非常感谢!
答案 0 :(得分:0)
这就是我的处理方式,这可能是错误的。
要正确计算两个纵向点和纬度点之间的距离,通常可以使用Haversine公式,但这是一个复杂的数学方程式,因此我要说的就是为什么要提供距离值。
我们可以使用毕达哥拉斯的欧几里得公式计算两个数据点(x1,y1)和(x2,x2)之间的距离,没想到我放学后这么说。值了
距离= square_root((x2-x1)^ 2 +(y2-y1)^ 2。
首先求平方的原因是因为经度和纬度数据可能具有负值。负的经度和纬度值可用于表示方向,即东。情节中的点x和y也可以具有负值,而不是在您的情况下,但是考虑到头脑是一个好习惯。
现在获取上面提供的两个数据文件,并将它们放在文本文件中,并保存在方便的地方。在控制台中,安装软件包dplyr以运行我的代码。
install.packages("dplyr")
您可以在此处使用以下代码: #读取列标题等于True的csv格式数据,并保持当前数据 通过as.is的#类型等于True。调用软件包dplyr以在当前会话中使用。 #choice.files()函数还可以让用户选择他/她需要的文件。 图书馆(dplyr) read.virtual.line <-read.csv(choose.files(),header = T,as.is = T) read.waypoints <-read.csv(choose.files(),header = TRUE)
# Convert files read into to data.frame and assign to a variable name.
df.virtual.line <- data.frame(read.virtual.line)
df.waypoints <- data.frame(read.waypoints)
# This peice of code is execute from the right of the <- first.
# Calculate the Euclidean distance and assign to dist_scale.
# mutate makes a new column called dist_scale with the result of the above
# calculation.
新列dist_scale
Tripld Lon1 Lat1 Lon2 Lat2 distance dist_scale
bb983d 11.565 48.19 11.55 48.143 7498 0.049335586
da5bgg 11.584 48.157 11.639 48.098 13643 0.080659779
saefeg 11.591 48.142 11.563 48.18 7377 0.047201695
查看dist_scale的第一个值。起点将为0,终点值为0.049335586。
其余的您将不得不尝试自己。我的浏览方式如下:
我建议在编写代码之前使用问题分解定义代码的运行方式,即上述步骤。如果您在编写代码时遇到麻烦,请至少尝试编写实现解决方案所需的步骤。将它们分解成块并将其发布在此处,Stakeoverflow用户将可以为您提供帮助。不要忘记添加您尝试过的代码。
如果在编写和运行代码时收到错误消息,请先搜索互联网,然后再在此处发布。那里有很多答案,您会发现对问题的答案不是唯一的。在任何搜索引擎中,在错误消息之前键入R可能会为您提供所需的帮助:“ R错误消息”。
祝您好运,希望对您有所帮助。