Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据另一列中标记的某个半径范围内的Lat和Lon列中的值忽略行,并创建新的数据框_R - Fatal编程技术网

R 根据另一列中标记的某个半径范围内的Lat和Lon列中的值忽略行,并创建新的数据框

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

我有一个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.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"))