根据标准过滤相似点
FIltering similar points based on a criteria
我在下面包含了我的示例数据集。在数据集中,我在给定日期的 hour
期间每个 ID
有多个点,并且在给定日期的每个 hour
期间有一些天我们有一个点。
我想确定在给定日期的每个小时内有多个点的点。例如,对于 ID
"A",我有多个点 hour
0 和 date
2010-12-26
。另一个标准是这些点的 x
和 y
坐标应该彼此不同(例如,使用 hour
2 的示例; x
和 y
第一个点的坐标应该与第二个点不同)。
这是重复的点,x
和y
这两点应该是不同的,但我不知道怎么改。
我希望能够从数据集中识别并过滤掉这些类型的点。
有什么好的方法吗?
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))
编辑:稍微改进了代码以确保所有 x
和 y
坐标即使在较大的组中也不同。
因此,我稍微更改了代码以生成 df
,以便让这些条件实际出现在数据框中。然后我的方法是按 ID
和 date
分组(因为已经包含小时),然后检查组内所有 x
和 y
坐标是否不同。
这是代码和结果:
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
我在下面包含了我的示例数据集。在数据集中,我在给定日期的 hour
期间每个 ID
有多个点,并且在给定日期的每个 hour
期间有一些天我们有一个点。
我想确定在给定日期的每个小时内有多个点的点。例如,对于 ID
"A",我有多个点 hour
0 和 date
2010-12-26
。另一个标准是这些点的 x
和 y
坐标应该彼此不同(例如,使用 hour
2 的示例; x
和 y
第一个点的坐标应该与第二个点不同)。
这是重复的点,x
和y
这两点应该是不同的,但我不知道怎么改。
我希望能够从数据集中识别并过滤掉这些类型的点。
有什么好的方法吗?
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))
编辑:稍微改进了代码以确保所有 x
和 y
坐标即使在较大的组中也不同。
因此,我稍微更改了代码以生成 df
,以便让这些条件实际出现在数据框中。然后我的方法是按 ID
和 date
分组(因为已经包含小时),然后检查组内所有 x
和 y
坐标是否不同。
这是代码和结果:
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