【问题标题】:Removing Spatial Outliers (lat and long coordinates) in R在 R 中删除空间异常值(纬度和经度坐标)
【发布时间】:2014-06-26 19:52:38
【问题描述】:

我已尽力阅读此内容,并且我认为我找到了最适合的过程,但如果其他人对此有任何想法或任何功能或不同方法,将不胜感激。所以我有一个不同行长的小数据帧列表,每个数据帧在不同的列中包含几个纬度和经度坐标。对于列表中的每个项目,我需要删除可能是异常值的坐标对,然后找到剩余坐标的平均中心(因此列表中的每个项目最后都应该有一个坐标对。

我读过的方法是分别找到所有纬度和经度的平均中心,然后计算从该平均中心到每个坐标对的欧几里德距离,并删除超过 a 的点所需的距离(比方说 100m)。然后最后计算剩余点的平均中心作为最终结果。不过,这对我来说似乎有点令人费解,所以再一次,如果有人对坐标异常值删除有任何建议,那可能会更好。

这是我目前掌握的一些代码:

dfList <- structure(list(`43` = structure(list(date = c("43 2011-04-06", "43 2011-04-07", "43 2011-04-08"), identifier = c(43, 43, 43), lon = c(-117.23041303, -117.23040817, -117.23039471), lat = c(32.81217294, 32.81218158, 32.81218645)), .Names = c("date", "identifier", "lon", "lat"), row.names = 13:15, class = "data.frame"), `44` = structure(list(date = c("44 2011-04-06", "44 2011-04-07", "44 2011-04-08"), identifier = c(44, 44, 44), lon = c(-117.22864227, -117.22861559, -117.22862265), lat = c(32.81257756, 32.81257089, 32.81257197)), .Names = c("date", "identifier", "lon", "lat"), row.names = 19:21, class = "data.frame"), `46` = structure(list(date = c("46 2011-04-06", "46 2011-04-07", "46 2011-04-08", "46 2011-04-09", "46 2011-04-10", "46 2011-04-11"), identifier = c(46, 46, 46, 46, 46, 46), lon = c(-117.22992617, -117.2289396895, -117.22965116, -117.23003928, -117.229922602, -117.22969664), lat = c(32.81295118, 32.8128226975, 32.81317299, 32.81224457, 32.813018734, 32.81276993)), .Names = c("date", "identifier", "lon", "lat"), row.names = 25:30, class = "data.frame"), `47` = structure(list(date = c("47 2011-04-06", "47 2011-04-07"), identifier = c(47, 47), lon = c(-117.2274484, -117.22747116), lat = c(32.81205838, 32.81207607)), .Names = c("date", "identifier", "lon", "lat"), row.names = 31:32, class = "data.frame")), .Names = c("43", "44", "46", "47"))

lonMean <- lapply(dfList, function(x) mean(x$lon)) #taking mean for longs
latMean <- lapply(dfList, function(x) mean(x$lat)) #taking mean for lats
latLon <- mapply(c, lonMean, latMean, SIMPLIFY=FALSE)#combining coord lists into one

编辑:所以我现在需要的是创建第一个列表中每个项目的所有坐标与第二个列表中匹配的平均坐标之间的距离,并从第一个列表中删除距离更大的任何点超过 100。 我以前使用过 dist 和 geodist(来自“gmt”)包,但我不知道如何将它们与这两个列表一起使用。然后进一步删除可能的异常值。非常感谢您提前提供的帮助,我不是最精通 R 的人,因此非常感谢您的帮助!

【问题讨论】:

  • 那么问题出在哪里?
  • 问题是我不确定如何从我拥有的两个列表中创建距离矩阵,然后如何删除异常值(但坐标对异常值,而不仅仅是单个坐标)。
  • 好的,不清楚。尽量做到简洁明了。如果您还没有,请阅读"How do I ask a good question?
  • 谢谢@Okuma.Scott,我已经编辑了我的问题,以便它有一个更具体的问题。
  • 定义异常值是一项棘手的工作...从您所说的看来,似乎总是有一个异常值。可能不止一个吗?还是根本没有?您可能需要阅读简历上的questions tagged 'outliers'

标签: r list latitude-longitude distance


【解决方案1】:

试试这个。

df <- do.call("rbind", dfList) # Flattens list into data frame, preserving 
                               # group identifier

# This function calculates distance in kilometers between two points
earth.dist <- function (long1, lat1, long2, lat2)
{
rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- R * c
return(d)
}

df$dist <- earth.dist(df$lon, df$lat, mean(df$lon), mean(df$lat))

df[df$dist >= 0.1,] # Filter those above 100m

【讨论】:

  • 这似乎正是我想要的。虽然我不认为超过 100m 的组内会有这么多点,但对于某些组标识符,我会没有任何点。也许我会弄乱我的距离阈值。谢谢!
  • 不客气!我不确定您是想要组均值还是总体均值-在我的示例中,我使用了总体均值来表示经纬度。这也可能会影响您的结果。
  • 哦,等等,我确实想要每个组的平均值,而不是整体平均值。我想我应该能够为此调整您的代码。
猜你喜欢
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2020-12-02
  • 2022-11-27
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多