R 根据另一列中标记的某个半径范围内的Lat和Lon列中的值忽略行,并创建新的数据框
我有一个excel表格设置,如下所示,并已加载为df:R 根据另一列中标记的某个半径范围内的Lat和Lon列中的值忽略行,并创建新的数据框,r,R,我有一个excel表格设置,如下所示,并已加载为df: GPS_Lat GPS_Lon Location 50.70528 -120.44984 0 50.70528 -120.44984 0 50.70527 -120.44984 0 50.70527 -120.44984 0 50.70526 -120.44984 1 50.70526 -120.44984 1 50.70525 -120.44984 1 50.7052
GPS_Lat GPS_Lon Location
50.70528 -120.44984 0
50.70528 -120.44984 0
50.70527 -120.44984 0
50.70527 -120.44984 0
50.70526 -120.44984 1
50.70526 -120.44984 1
50.70525 -120.44984 1
50.70525 -120.44984 0
50.70524 -120.44984 0
50.70524 -120.44984 0
50.70523 -120.44984 0
50.70523 -120.44984 0
50.70522 -120.44984 0
50.70522 -120.44984 0
50.70521 -120.44984 1
50.70521 -120.44984 1
50.7052 -120.44985 1
50.7052 -120.44985 1
50.70519 -120.44985 0
50.70519 -120.44986 0
50.70518 -120.44986 0
50.70518 -120.44986 0
50.70517 -120.44987 0
50.70517 -120.44987 0
我希望将值保持在向下移动位置列时遇到的第一个“1”的1m范围内,并将这些值放在新的数据帧(名为:df-n)中。如果有其他部分的值为1,我希望将其拆分为单独的数据帧(命名为:df-n+1),同时仅将点保持在前1个1的1m范围内。我希望每个新的数据帧都按顺序编号。我完全被这件事难住了
自动识别下面的点,并创建新的数据帧,每个数据帧的行与这些点(或任何其他定义的距离)之间的距离在1米以内,且具有原始数据帧名称和顺序后缀。因此,最初的“df”第二个“df-1”和“df-2”
我最终将使用10公里的半径,我的数据集最多可以有20k行
编辑:为输出提供清晰性。使用半径截止为2m的假设距离
Row GPS_Lat GPS_Lon Location hypothetical_dist_1 hypothetical_dist_2
1 50.70528 -120.44984 0 4 14
2 50.70528 -120.44984 0 3 13
3 50.70527 -120.44984 0 2 12
4 50.70527 -120.44984 0 1 11
5 50.70526 -120.44984 1 0 10
6 50.70526 -120.44984 1 1 9
7 50.70525 -120.44984 1 2 8
8 50.70525 -120.44984 0 3 7
9 50.70524 -120.44984 0 4 6
10 50.70524 -120.44984 0 5 5
11 50.70523 -120.44984 0 6 4
12 50.70523 -120.44984 0 7 3
13 50.70522 -120.44984 0 8 2
14 50.70522 -120.44984 0 9 1
15 50.70521 -120.44984 1 10 0
16 50.70521 -120.44984 1 11 1
17 50.7052 -120.44985 1 12 2
18 50.7052 -120.44985 1 13 3
19 50.70519 -120.44985 0 14 4
20 50.70519 -120.44986 0 15 5
21 50.70518 -120.44986 0 16 6
22 50.70518 -120.44986 0 17 7
23 50.70517 -120.44987 0 18 8
24 50.70517 -120.44987 0 19 9
输出:
df-1
Row GPS_Lat GPS_Lon Location hypothetical_dist_1
3 50.70527 -120.44984 0 2
4 50.70527 -120.44984 0 1
5 50.70526 -120.44984 1 0
6 50.70526 -120.44984 1 1
7 50.70525 -120.44984 1 2
及
基本上,工作流程如下:将多个.csv文件批量加载到一个列表中,根据文件名命名列表项,使用选定的半径(输入filename-1、filename-2等)分隔每个列表项,将其他列中的值相对打印,并导出所有打印。,如果您计划以类似的方式处理单个帧,我通常建议不要存储到单个帧中。(有关“框架列表”的讨论,请参见。) 为了演示使用/丢弃了哪些行,我将在这里添加
$row
。我的任何代码都不需要(或使用)它,只是为了演示
此外,您提到了与第一个“1”的距离,但在前4行中没有前面的“1”。由于我处理的其余部分假定第一行是有意义的,因此我将把第一个“1”(在本例中是第5行)复制为第一行,以便后续的分组距离测量按预期工作
为了便于分组,我将在这里使用dplyr
库(dplyr)
如果(dat$位置[1]!=1){
预先准备的1%
解组()
dat2
##A tibble:25 x 6
#GPS_Lat GPS_Lon位置行grp距离
#
# 1 50.7 -120. 1 0 1 0
# 2 50.7 -120. 0 1 1 2.22
# 3 50.7 -120. 0 2 1 2.22
# 4 50.7 -120. 0 3 1 1.11
# 5 50.7 -120. 0 4 1 1.11
# 6 50.7 -120. 1 5 2 0
# 7 50.7 -120. 1 6 2 0
# 8 50.7 -120. 1 7 2 1.11
# 9 50.7 -120. 0 8 2 1.11
# 10 50.7 -120. 0 9 2 2.22
##…还有15行
这提供了与“组中第一个1”的距离(请注意grp
变量)。从这里,可以很容易地按dist
进行过滤,并按grp
进行分割
根据后续流程的不同,最好使用dplyr::group_by
,保持这种单帧格式,不过修改看不见的代码是另一种冒险
您的数据(除了第一行本身)都不在1m范围内,因此为了演示,我将使用“2m”
dat2%>%
过滤器(距离%
过滤(dist您可以使用base R的dist(…)函数获得所有点之间的距离。100米(以分钟为单位)的纬度约为0.009,因此您可以查看距离矩阵对象以确定哪些点之间的距离小于100米
请注意,这使用了欧几里德距离,这对于以lat/long表示的短距离来说是可以的,但是如果您将其用于长距离超过几英里,则会遇到问题
我为任何想尝试解决方案的人提供了一个reprex,请随意添加到您的问题中
latlong <- c(50.70528, 50.70528, 50.70527, 50.70527, 50.70526, 50.70526, 50.70525, 50.70525, 50.70524, 50.70524, 50.70523, 50.70523, 50.70522, 50.70522, 50.70521, 50.70521, 50.7052, 50.7052, 50.70519, 50.70519, 50.70518, 50.70518, 50.70517, 50.70517, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44985, -120.44985, -120.44985, -120.44986, -120.44986, -120.44986, -120.44987, -120.44987, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
latlong <- matrix(latlong, nrow = 24)
distance_matrix <- as.matrix(dist(latlong[,c(1,2)], method = "euclidean"))
latlong请不要发布代码/数据/错误的图像:无法复制或搜索(SEO),它会破坏屏幕阅读器,并且可能不适合某些移动设备。参考:(和)。请仅包括代码、控制台输出或数据(例如,dput(head(x))
或data.frame(…)
)直接。我会改变的!更好,谢谢!(Nitnoid,对于未来的编辑:如果我们可以作为一个表进行复制/粘贴,这会有所帮助,但是嵌入空格会让这变得更加困难:要么我们必须手动编辑复制的文本,要么……我们放弃,不尝试。R的“黄金标准”要么是data.frame(…)
(如果可能,以编程方式构建它)或粘贴来自dput(x)
的输出,其中x
是“问题所需的最小值”。(不过,在这种简单的情况下,将GPS Lat
更改为GPS_Lat
,没有空格,Lon也是如此。)感谢您提供的信息,我不确定如何以可用的格式获取数据,因为我的实际数据帧多了25列,大约15000行。(如果有助于理解,我可以从GPS\u Lat
到-120.44987 0
,复制,然后在R中运行读取.table(header=t,'clipboard')
以“获取”您的数据。当存在嵌入空格或其他情况时,这不起作用。仅供参考,谢谢!)即使是短距离,lat/lon上的欧几里德距离也永远不会很好。例如,在纬度与经度之间添加0.0001
,结果是7米或11米(给或拿)。如果你想使用欧几里德,你应该真正转换为UTM,因为欧几里德数学实际上是可靠的。地球圈::distVincentyEllipsoid(rbind(dat[1,1:2],dat[1,1:2]+c(0.0001,0))[,2:1])
和地球圈::distVincentyEllipsoid(rbind(dat[1,1:2],dat[1,1:2]+c(0,0.0001))[,2:1])
,例如。我想我需要检查我的假设!我使用了欧几里德公式,其中小距离可以忽略不计……但你是对的,它不可缩放。谢谢你的示例。我真的不知道你在t中期望什么
latlong <- c(50.70528, 50.70528, 50.70527, 50.70527, 50.70526, 50.70526, 50.70525, 50.70525, 50.70524, 50.70524, 50.70523, 50.70523, 50.70522, 50.70522, 50.70521, 50.70521, 50.7052, 50.7052, 50.70519, 50.70519, 50.70518, 50.70518, 50.70517, 50.70517, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44984, -120.44985, -120.44985, -120.44985, -120.44986, -120.44986, -120.44986, -120.44987, -120.44987, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0)
latlong <- matrix(latlong, nrow = 24)
distance_matrix <- as.matrix(dist(latlong[,c(1,2)], method = "euclidean"))