首页 > 解决方案 > 是否有一个包含当前行的变量,用于过滤 R 中的子集?

问题描述

我想过滤一个包含纬度和经度的大型数据框。我想使用方法distHaversine(),它通过纬度和经度生成两点之间的距离。有了这个,我想过滤掉远离城市的测量值。该方法需要 2 个向量,一个参考点和一个特定点,每个向量包含 2 个值(纬度,经度)。

是否有一个通用变量我可以选择从我的数据框中获取 lat, lon,比如distHaversine(c(8.682127, 50.110922), c([i,lat], [i,lon]))

我的解决方法是仅按纬度和经度的具体值进行过滤。感谢帮助 :)

使用 lat 和 lon 会导致错误,因为该方法将计算一个点的距离,而不是整个集合。所以我需要为这个函数一次取一个值。

评估错误:向量的长度错误,应为 2。

library(geosphere)   
library(readr)


ff <- function(x, pos)  subset(x, distHaversine(c(8.682127, 50.110922), c(lat, lon))<60000,    select= c(lat, lon, timestamp, value ))


yy <- readr::read_csv2_chunked("data.csv", DataFrameCallback$new(ff), 
    chunk_size = 100000, col_names = TRUE)

编辑:由于某种原因, lat 和 long 是整数,没有双精度值。我注意到并除以 1000 进行计算

    dput(head(yy, 20))
structure(list(lat = c(52023, 42139, 43762, 52023, 54644, 52023, 
52023, 51278, -32879, 52023, 51434, 52023, 42139, 43762, 52023, 
52023, 52023, -32879, 52023, 52023), lon = c(4692, 24794, -79185, 
4692, 9760, 4692, 4692, 12588, -68877, 4692, 6115, 4692, 24794, 
-79185, 4692, 4692, 4692, -68877, 4692, 4692), timestamp =    structure(c(1538352021, 
1538352035, 1538352044, 1538352050, 1538352061, 1538352080, 1538352110, 
1538352110, 1538352132, 1538352140, 1538352147, 1538352170, 1538352183, 
1538352192, 1538352200, 1538352230, 1538352260, 1538352283, 1538352290, 
1538352320), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    P1 = c("1.2", "10.80", "3.00", "1.7", "12.3", "2.0", "1.0", 
    "4.75", "1.00", "1.0", "19.3", "1.8", "11.60", "4.00", "1.0", 
    "0.8", "1.0", "2.00", "1.1", "1.3")), .Names = c("lat", "lon", 
"timestamp", "P1"), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame")) 

结果应为过滤后的数据帧

lat     lon     timestamp    P1        
9,5     50,5     1.1.2019    123    
8,8     49,3     1.1.2019    23     
...

标签: rsubsetreadr

解决方案


我遇到了同样的问题,并为 geosphere 的distGeo. 测地距离比半正弦要准确得多,但同样也可以使用distHaversine.

数据

library(geosphere)
library(tidyverse)
source("https://raw.githubusercontent.com/RomanAbashin/distGeo_v/master/distGeo_v.R")

df <- tibble(lon = rnorm(1000, 16.3738, sd = 1),
             lat = rnorm(1000, 48.2082, sd = 1),
             cx = 16.3738,
             cy = 48.2082)

代码

df %>%
    filter(distGeo_v(lon, lat, cx, cy) < 10000)

结果

# A tibble: 5 x 4
    lon   lat    cx    cy
  <dbl> <dbl> <dbl> <dbl>
1  16.5  48.2  16.4  48.2
2  16.3  48.2  16.4  48.2
3  16.4  48.3  16.4  48.2
4  16.3  48.2  16.4  48.2
5  16.3  48.2  16.4  48.2

推荐阅读