根据标准过滤相似点

FIltering similar points based on a criteria

我在下面包含了我的示例数据集。在数据集中,我在给定日期的 hour 期间每个 ID 有多个点,并且在给定日期的每个 hour 期间有一些天我们有一个点。

我想确定在给定日期的每个小时内有多个点的点。例如,对于 ID "A",我有多个点 hour 0 和 date 2010-12-26。另一个标准是这些点的 xy 坐标应该彼此不同(例如,使用 hour 2 的示例; xy 第一个点的坐标应该与第二个点不同)。

这是重复的点,xy这两点应该是不同的,但我不知道怎么改。

我希望能够从数据集中识别并过滤掉这些类型的点。

有什么好的方法吗?

library(lubridate)
library(tidyverse)
library(purrr)

date <- rep_len(seq(dmy_hms("26-12-2010 00:00:00"), dmy_hms("31-12-2010 24:00:00"), by = "2 hours"), 100)
ID <- rep(c("A","B"), 100)
df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID,
                 hour = hour(date))

编辑:稍微改进了代码以确保所有 xy 坐标即使在较大的组中也不同。

因此,我稍微更改了代码以生成 df,以便让这些条件实际出现在数据框中。然后我的方法是按 IDdate 分组(因为已经包含小时),然后检查组内所有 xy 坐标是否不同。 这是代码和结果:

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
library(tidyverse)
library(purrr)

date <- rep_len(seq(dmy_hms("26-12-2010 00:00:00"), dmy_hms("31-12-2010 24:00:00"), by = "2 hours"), 100)
ID <- rep(c(rep("A", 25), rep("B", 25)), 2)
df <- data.frame(date = date,
                 x = runif(length(date), min = 60000, max = 80000),
                 y = runif(length(date), min = 800000, max = 900000),
                 ID,
                 hour = hour(date))

df <- df %>% 
  group_by(date, ID) %>% 
  mutate(obs_per_hour_ID = n(),
         n_distinct_x = n_distinct(x),
         n_distinct_y = n_distinct(y),
         all_true = all(n_distinct_x == obs_per_hour_ID, 
                        n_distinct_y == obs_per_hour_ID,
                        obs_per_hour_ID > 1))

result <-  df %>% 
  filter(all_true) %>% 
  select(-contains("distinct"), -all_true, -obs_per_hour_ID)
result
#> # A tibble: 8 × 5
#> # Groups:   date, ID [4]
#>   date                     x       y ID     hour
#>   <dttm>               <dbl>   <dbl> <chr> <int>
#> 1 2010-12-26 00:00:00 68249. 839183. A         0
#> 2 2010-12-26 02:00:00 67722. 881265. A         2
#> 3 2010-12-28 02:00:00 78020. 807422. B         2
#> 4 2010-12-28 04:00:00 72368. 873905. B         4
#> 5 2010-12-26 00:00:00 68788. 897331. A         0
#> 6 2010-12-26 02:00:00 67106. 804228. A         2
#> 7 2010-12-28 02:00:00 61158. 848782. B         2
#> 8 2010-12-28 04:00:00 65634. 889615. B         4

由 reprex 包 (v2.0.1) 创建于 2022-02-02