Как определить группы межиндивидуального повторения?

У меня есть кадр выходных данных из пакета «recurse», вычисляющий частоту повторных посещений нескольких человек на основе точек GPS. Во фрейме данных у меня есть 18 столбцов, включая «сайт» и «идентификатор», и> 43 000 строк.

У меня есть два вопроса: (1) какие сайты используются несколькими людьми и (2) какие люди используют один и тот же сайт.

Я сгруппировал фрейм данных по сайту и идентификатору, чтобы затем отфильтровать только сайты с более чем одним подключенным идентификатором:

library(tidyverse)
sites <- tab %>% group_by(site, id) %>% summarise(n = n()) # gives me all sites and connected ids
sites2 <- sites %>% group_by(site) %>% summarise(n = n()) # gives me all sites and the count of connected ids
sites3 <- subset(sites2, n > 1) # gives me only sites with more than one connected id
#filter original data frame to only have sites that are connected to more that one id
filtered <- left_join(sites3, df, by = "site")
#group again by site and id
filtered2 <- filtered %>% group_by(site, id) %>% summarise(n = n())

Я не эксперт в R, поэтому я думаю, что это можно было бы сделать проще или чище, но это сработало с моим знанием R. Благодаря этому я знаю, какие сайты посещают разные люди. Теперь у меня есть что-то похожее на это:

# A tibble: 3,041 x 3
   site         id     n
   <chr>     <int> <int>
 1 site 1      152     2
 2 site 1      160    13
 3 site 1000   164     4
 4 site 1000   166     1
 5 site 1001   164     2
 6 site 1001   166     1
 7 site 1002   164     4
 8 site 1002   166     1
 9 site 1003   164     3
10 site 1003   166     3
# ... with 3,031 more rows

Теперь я застрял. Я хотел бы назначить «группы» лицам, использующим один и тот же сайт. Например, вы можете видеть, что идентификаторы 152 и 160 используют сайт 1, а идентификаторы 164 и 166 используют сайты 1000, 1001, 1002 и так далее. В этом случае «группа1» будет присвоена идентификаторам 152 и 160, а «группа2» — 164 и 166.

Есть ли способ сделать это в R? Есть 37 человек и все еще> 3000 строк данных, так что это много, чтобы пройти вручную. Некоторые сайты используют 3 или 4 человека, и я не уверен, всегда ли к сайту подключены одни и те же комбинации идентификаторов, поэтому я не могу заранее определить группы.

Вот фрагмент сгруппированного фрейма данных:

df <- structure(list(site = c("site 1", "site 1", "site 1000", "site 1000", 
"site 1001", "site 1001", "site 1002", "site 1002", "site 1003", 
"site 1003", "site 1007", "site 1007", "site 1008", "site 1008", 
"site 1009", "site 1009", "site 1015", "site 1015", "site 1019", 
"site 1019", "site 1020", "site 1020", "site 1022", "site 1022", 
"site 1024", "site 1024", "site 1034", "site 1034", "site 1035", 
"site 1035", "site 1036", "site 1036", "site 107", "site 107", 
"site 108", "site 108", "site 111", "site 111", "site 131", "site 131", 
"site 132", "site 132", "site 133", "site 133", "site 134", "site 134", 
"site 135", "site 135", "site 136", "site 136"), id = c(152L, 
160L, 164L, 166L, 164L, 166L, 164L, 166L, 164L, 166L, 164L, 166L, 
164L, 166L, 164L, 166L, 164L, 166L, 164L, 166L, 164L, 166L, 164L, 
166L, 164L, 166L, 164L, 166L, 164L, 166L, 164L, 166L, 155L, 161L, 
155L, 161L, 155L, 161L, 155L, 161L, 155L, 161L, 155L, 161L, 155L, 
161L, 155L, 161L, 155L, 161L), n = c(2L, 13L, 4L, 1L, 2L, 1L, 
4L, 1L, 3L, 3L, 5L, 8L, 4L, 6L, 5L, 17L, 1L, 1L, 3L, 1L, 3L, 
2L, 3L, 1L, 3L, 1L, 3L, 1L, 1L, 5L, 1L, 4L, 5L, 3L, 5L, 3L, 2L, 
1L, 5L, 3L, 5L, 3L, 5L, 3L, 5L, 3L, 5L, 3L, 4L, 2L)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -50L), groups = structure(list(
    site = c("site 1", "site 1000", "site 1001", "site 1002", 
    "site 1003", "site 1007", "site 1008", "site 1009", "site 1015", 
    "site 1019", "site 1020", "site 1022", "site 1024", "site 1034", 
    "site 1035", "site 1036", "site 107", "site 108", "site 111", 
    "site 131", "site 132", "site 133", "site 134", "site 135", 
    "site 136"), .rows = structure(list(1:2, 3:4, 5:6, 7:8, 9:10, 
        11:12, 13:14, 15:16, 17:18, 19:20, 21:22, 23:24, 25:26, 
        27:28, 29:30, 31:32, 33:34, 35:36, 37:38, 39:40, 41:42, 
        43:44, 45:46, 47:48, 49:50), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -25L), .drop = TRUE))

Благодарю вас!

Отвечает ли это на ваш вопрос? Как создать последовательный номер группы

benson23 10.05.2022 13:47

Поскольку ваш df уже сгруппирован по site, вы можете просто сделать df %>% mutate(Group = paste0("group", cur_group_id()))

benson23 10.05.2022 13:48

Спасибо, но я не совсем это имею в виду. Ваш код дает каждому сайту свой номер группы. Я имею в виду столбец, который дает сайтам с одинаковой комбинацией идентификаторов один и тот же номер группы. Извините, если это было непонятно.

Justine Güldenpfennig 10.05.2022 15:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я нашел обходной путь. Может быть, не самый элегантный, но на случай, если у кого-то возникнет такой же вопрос:

Я снова использовал dplyr и свернул все идентификаторы в группу, чтобы затем сгруппировать их по новой группе:

df <- filtered2 %>% 
  group_by(site) %>% 
  mutate(groups = paste0(id, collapse = " "))
df2 <- df %>% group_by(groups) %>% summarise(n = n())

Затем это дало мне все комбинации идентификаторов (а также то, как часто эти комбинации встречаются), как мне было нужно.

Другие вопросы по теме