根据数据帧内点的距离反转数据帧列表的元素

问题描述 投票:0回答:0

我有以下带有点数据框的列表:

# > trace
# [[1]]
# counter          X          Y L1  id    ref
# 1:       1 12.0165469 47.9982008  1 533 EBE 20
# 2:       2 12.0164185 47.9981120  1 533 EBE 20
# 3:       3 12.0163478 47.9980425  1 533 EBE 20
# 4:       4 12.0162577 47.9979528  1 533 EBE 20
# 5:       5 12.0161357 47.9978117  1 533 EBE 20
# 6:       6 12.0160016 47.9976360  1 533 EBE 20
# 
# [[2]]
# counter          X          Y L1   id     ref
# 1:       7 11.8333238 48.1269572  2 4665 St 2081
# 2:       8 11.8330935 48.1267962  2 4665 St 2081
# 
# [[3]]
# counter          X          Y L1   id     ref
# 1:       9 11.8338450 48.1271528  3 4666 St 2081
# 2:      10 11.8335776 48.1270632  3 4666 St 2081

我想遍历一个列表,同时计算当前数据帧的最后一个点和下一个数据帧的第一个点之间的距离(distance_1),

以及当前数据帧的最后一个点与下一个数据帧的最后一个点之间的距离(distance_2).

如果distance_1大于distance_2,我将反转下一个数据帧中元素的顺序。

这是伪代码的样子:

compare<-function(data_frame,next_dataframe){
    
     distance_1<-geosphere::distGeo(p1=data_frame[nrow(data_frame),],p2=next_dataframe[first(next_dataframe),])
     distance_2<-geosphere::distGeo(p1=data_frame[nrow(data_frame),],p2=next_dataframe[nrow(next_dataframe),])
     if (distance_1>distance_2)
        next_dataframe<-as.data.frame(next_dataframe, 2, rev)
 }
 lapply(x, function(x)compare(x,x+1)) 

期望的结果看起来像这样; dataframe [[3]] 的元素将被推翻

# > trace
# [[1]]
# counter          X          Y L1  id    ref
# 1:       1 12.0165469 47.9982008  1 533 EBE 20
# 2:       2 12.0164185 47.9981120  1 533 EBE 20
# 3:       3 12.0163478 47.9980425  1 533 EBE 20
# 4:       4 12.0162577 47.9979528  1 533 EBE 20
# 5:       5 12.0161357 47.9978117  1 533 EBE 20
# 6:       6 12.0160016 47.9976360  1 533 EBE 20
# 
# [[2]]
# counter          X          Y L1   id     ref
# 1:       7 11.8333238 48.1269572  2 4665 St 2081
# 2:       8 11.8330935 48.1267962  2 4665 St 2081
# 
# [[3]]
# counter          X          Y L1   id     ref
# 2:      10 11.8335776 48.1270632  3 4666 St 2081
# 1:       9 11.8338450 48.1271528  3 4666 St 2081

是否可以在没有外部包的情况下实现这一目标?

只是用基数 R?

这是名单:

trace<-list(
  structure(
    list(
      counter = 1:6,
      X = c(
        12.0165469,
        12.0164185,
        12.0163478,
        12.0162577,
        12.0161357,
        12.0160016
      ),
      Y = c(
        47.9982007999381,
        47.9981119999382,
        47.9980424999382,
        47.9979527999382,
        47.9978116999382,
        47.9976359999383
      ),
      L1 = c(1, 1, 1, 1, 1, 1),
      id = c(533, 533,
             533, 533, 533, 533),
      ref = c("EBE 20", "EBE 20", "EBE 20", "EBE 20",
              "EBE 20", "EBE 20")
    ),
    row.names = c(NA,-6L),
    class = c("data.table",
              "data.frame")
  ),
  structure(
    list(
      counter = 7:8,
      X = c(11.8333238, 11.8330935),
      Y = c(48.1269571999072, 48.1267961999073),
      L1 = c(2, 2),
      id = c(4665, 4665),
      ref = c("St 2081", "St 2081")
    ),
    row.names = c(NA,-2L),
    class = c("data.table", "data.frame")
  ),
  structure(
    list(
      counter = 9:10,
      X = c(11.833845, 11.8335776),
      Y = c(48.1271527999072, 48.1270631999072),
      L1 = c(3, 3),
      id = c(4666, 4666),
      ref = c("St 2081", "St 2081")
    ),
    row.names = c(NA,-2L),
    class = c("data.table", "data.frame")
  )
)

谢谢。

r
© www.soinside.com 2019 - 2024. All rights reserved.