r - 是否有一个包含当前行的变量,用于过滤 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
...
解决方案
我遇到了同样的问题,并为 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
推荐阅读
- email - Outlook Mailcow 错误的 ssl 证书
- python-3.x - Python 的 lambda 函数中的无效闭包
- hostname - URL中的主机名“ww8”代表什么
- swift - 编辑-我怎样才能让 UIlabel 进入容器的中间?
- sql - 如何使用Join连接三个Sql表的列数据
- javascript - 如何使用 javascript 或 typescript 删除 event.js 和 bootstrap.min.js 的事件监听器?
- sql-server - 如何在 SQL 中及时转换 int 列“HH:MM”?
- string - Javascript Integer,最后带有逗号和零
- reactjs - 与 if 函数一起使用渲染时,无法获取发送到子类组件的道具值
- sql - 我怎样才能获得同名员工的所有ID