Я борюсь с изменением нумерации результатов пересечения / group_indices в R в течение нескольких дней. Пример кадра данных показан ниже:
t <- data.frame(mid=c(102,102,102,102,102,102,102,103,103,103,103,103,103,103),
aid=c(10201,10202,10203,10204,10205,10206,10207,
10301,10302,10303,10304,10305,10306,10307),
dummy=c(0,1,0,1,0,1,0,0,1,0,1,0,1,0),
location=c(0,2,0,4,0,1,0,0,2,0,2,0,3,0)
)
Мне нужно обновить номера, хранящиеся в полях «location», на последовательные номера группой «mid», не меняя порядок, определяемый «aid». «mid» - это идентификатор отдельных лиц (людей), а «aid» - их последовательный журнал активности за один день.
«location» определяет уникальный идентификатор местоположения, которое посещает каждый «mid». Таким образом, местоположение «2» в 9-м ряду и в 11-м ряду одинаково для середины = 102; однако одно и то же число во 2-м ряду не означает то же самое место, которое посещают в середине = 103 для середины = 102.
Фрейм данных "t" указан ниже:
mid aid dummy location
1 102 10201 0 0
2 102 10202 1 2
3 102 10203 0 0
4 102 10204 1 4
5 102 10205 0 0
6 102 10206 1 1
7 102 10207 0 0
8 103 10301 0 0
9 103 10302 1 2
10 103 10303 0 0
11 103 10304 1 2
12 103 10305 0 0
13 103 10306 1 3
14 103 10307 0 0
Исходя из вышеизложенной идеи, числа, хранящиеся в поле «местоположение», должны быть обновлены, как показано ниже:
mid aid dummy location
1 102 10201 0 0
2 102 10202 1 1
3 102 10203 0 0
4 102 10204 1 2
5 102 10205 0 0
6 102 10206 1 3
7 102 10207 0 0
8 103 10301 0 0
9 103 10302 1 1
10 103 10303 0 0
11 103 10304 1 1
12 103 10305 0 0
13 103 10306 1 2
14 103 10307 0 0
Условия:
- Номер местоположения с "dummy = 0" должен быть сохранен как 0
- Номер местоположения должен начинаться с 1 для каждого «середины»
- Если он / она посетил другое место по сравнению с местами, где он / она посещал в предыдущих строках, добавьте 1 к новому месту
- Операция должна быть реализована в конвейерном процессе, предоставляемом tidyverse
Исходный фрейм данных получается из функции конвейера в tidyverse с использованием group_indices или base :: intersection; однако эти функции иногда возвращают неупорядоченный результат.
Есть ли какие-либо решения для этой проблемы?
Я нашел одно решение в этой ссылке , используя {data.table} , но я предпочитаю использовать tidyrverse для сохранения операций канала.
В R приведено множество примеров, которые дают одинаковые номера, но я не смог найти решений для последовательной нумерации этих идентификаторов без изменения их порядка.