Есть ли функция R или строка кода, чтобы определить, когда два столбца ячеек в строке дублируются? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть фрейм данных в R с примерно 1700 наблюдениями. Я пересек точки GPS с многоугольниками и хочу определить, входят ли несколько идентификаторов в один и тот же многоугольник в один и тот же 12-часовой период (с 18:00 до 6:00). Вот заголовок моего фрейма данных.

  ID           date              time     DOP       datetime        p   pid1  Long     Lat
 289 Friday, September 1, 2017 1:15:29 AM 4.2 2017-09-01 01:15:29 <NA>    2 763692.8 3617676
 289 Friday, September 1, 2017 4:15:15 AM 1.4 2017-09-01 04:15:15 <NA>    2 763674.5 3617692
 299 Friday, September 1, 2017 5:00:16 AM 3.6 2017-09-01 05:00:16 <NA>    2 764427.2 3616750
  13 Friday, September 1, 2017 5:15:25 AM 2.8 2017-09-01 05:15:25 <NA>    1 767800.5 3613057
 299 Friday, September 1, 2017 5:15:29 AM 1.6 2017-09-01 05:15:29 <NA>    2 764420.7 3616746
 299 Friday, September 1, 2017 5:30:08 AM 1.4 2017-09-01 05:30:08 <NA>    2 764420.7 3616747

Вы можете видеть, что на пятницу, 1 сентября 2017 года, оба идентификатора 289 и 299 находятся внутри PID1 # 2 (PID1 # 2 относится к многоугольнику # 2) в один балл (с интервалом примерно 45 минут). Я хотел бы иметь некоторую функцию или скрипт для обработки моего набора данных и определения случаев, когда это происходит. Таким образом, я могу определить, какие идентификаторы находятся в каком PID1 в течение определенных c раз (в пределах 12-часового окна), чтобы в конечном итоге получить набор данных, который показывает, сколько раз несколько идентификаторов взаимодействуют в пределах определенного c многоугольника.

Вот образец набора данных с использованием dput для первых 5 строк моего набора данных:

structure(list(X = c("388933", "387022", "507722", "941954", 
"506441"), ID = structure(c(12L, 12L, 15L, 1L, 15L), .Label = c("13", 
"17", "97", "100", "253", "255", "256", "259", "263", "272", 
"281", "289", "294", "297", "299", "329", "337", "339", "344", 
"347"), class = "factor"), date = c("Friday, September 1, 2017", 
"Friday, September 1, 2017", "Friday, September 1, 2017", "Friday, September 1, 2017", 
"Friday, September 1, 2017"), time = c("1:15:29 AM", "4:15:15 AM", 
"5:00:16 AM", "5:15:25 AM", "5:15:29 AM"), DOP = c(4.2, 1.4, 
3.6, 2.8, 1.6), datetime = structure(c(1504246529, 1504257315, 
1504260016, 1504260925, 1504260929), class = c("POSIXct", "POSIXt"
), tzone = "CST6CDT"), p = c(NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_), pid1 = c("2", "2", "2", "1", "2"
), Long = c(763692.811797531, 763674.546077539, 764427.163679506, 
767800.455784065, 764420.684442097), Lat = c(3617675.85664874, 
3617692.02070415, 3616749.72487458, 3613057.33334349, 3616746.22303673
)), row.names = c("224811", "223697", "277383", "525686", "276768"
), class = "data.frame")

РЕДАКТИРОВАТЬ: Я редактирую это, чтобы показать, как я понял, как это сделать.

uni <- unique(df[,c("ID","date", "pid1")])
df2 <- aggregate(ID~pid1+date, data= uni,length)

Это позволило создать фрейм данных с количеством уникальных идентификаторов на pid1 в день.

Спасибо

1 Ответ

0 голосов
/ 20 июня 2020

Major EDIT

Попробуйте сейчас на своих реальных данных. Думаю, я позволял тому факту, что идентификация была фактором, мешающим. Если мы согласны с тем, что это дает вам правильные идеи, мы можем закрыть основы и, возможно, начать новый вопрос по вашим 12-часовым блокам.

library(dplyr)
library(tidyr)

set.seed(2020)
ID <- sample(10:200, replace = TRUE, size = 1000)
PID <- sample(1:31, replace = TRUE, size = 1000)
Date <- sample(c("Friday, September 1, 2017",
                  "Saturday, September 2, 2017",
                  "Sunday, September 3, 2017",
                  "Monday, September 4, 2017",
                  "Tuesday, September 5, 2017",
                  "Wednesday, September 6, 2017",
                  "Thursday, September 7, 2017",
                  "Friday, September 8, 2017"),
                replace = TRUE,
                size = 1000)

play <- data.frame(ID, Date, PID)
play$ID <- factor(play$ID)


ids_by_pid <- 
  play %>%
  mutate(ID = as.integer(as.character(ID))) %>%
  arrange(Date, PID, ID) %>%
  tidyr::pivot_wider(id_cols = Date,
                     values_from = ID,
                     names_from = PID,
                     names_prefix = "pid",
                     names_sort = TRUE,
                     values_fn = list)

Вот код, который я использую для сравнения идентификаторов в PID для конкретный день

play %>% 
  filter(Date == "Saturday, September 2, 2017", PID == "1") %>%
  pull(ID) 
#> [1] 40  30  89  133 36 
#> 189 Levels: 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 200


ids_by_pid %>% 
  filter(Date == "Saturday, September 2, 2017") %>% 
  select(pid1) %>% 
  pull %>%
  unlist
#> [1]  30  36  40  89 133
...