У меня есть кадр выходных данных из пакета «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))
Благодарю вас!
Поскольку ваш df
уже сгруппирован по site
, вы можете просто сделать df %>% mutate(Group = paste0("group", cur_group_id()))
Спасибо, но я не совсем это имею в виду. Ваш код дает каждому сайту свой номер группы. Я имею в виду столбец, который дает сайтам с одинаковой комбинацией идентификаторов один и тот же номер группы. Извините, если это было непонятно.
Хорошо, я нашел обходной путь. Может быть, не самый элегантный, но на случай, если у кого-то возникнет такой же вопрос:
Я снова использовал dplyr
и свернул все идентификаторы в группу, чтобы затем сгруппировать их по новой группе:
df <- filtered2 %>%
group_by(site) %>%
mutate(groups = paste0(id, collapse = " "))
df2 <- df %>% group_by(groups) %>% summarise(n = n())
Затем это дало мне все комбинации идентификаторов (а также то, как часто эти комбинации встречаются), как мне было нужно.
Отвечает ли это на ваш вопрос? Как создать последовательный номер группы